私はCakePHP 2.2.4を使用して非常に奇妙な問題を抱えています。何が起こるか説明させてください。
これらのmysqlテーブルがあります:
リード
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | YES | MUL | NULL | |
| date | datetime | YES | | NULL | |
| ip | varchar(45) | YES | | NULL | |
| service_id | int(11) | YES | MUL | NULL | |
| location | varchar(255) | YES | | NULL | |
| message | text | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
ユーザー
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| email | varchar(200) | YES | | NULL | |
| pwd | varchar(200) | YES | | NULL | |
| role_id | int(11) | YES | MUL | NULL | |
| active | tinyint(4) | YES | | 0 | |
+---------+--------------+------+-----+---------+----------------+
プロファイル
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_id | int(11) | YES | MUL | NULL | |
| name | varchar(120) | YES | | NULL | |
| surname | varchar(120) | YES | | NULL | |
| company | varchar(200) | YES | | NULL | |
| vat | varchar(60) | YES | | NULL | |
+---------+--------------+------+-----+---------+----------------+
住所
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| profile_id | int(11) | YES | MUL | NULL | |
| address | varchar(255) | YES | | NULL | |
| city | varchar(120) | YES | | NULL | |
| zip_code | char(5) | YES | | NULL | |
| nation | varchar(120) | YES | | NULL | |
| telephone | varchar(200) | YES | | NULL | |
| mobile | varchar(200) | YES | | NULL | |
| fax | varchar(200) | YES | | NULL | |
| email | varchar(200) | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
役割
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
サービス
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
以下は、私が使用するすべてのCakePhpモデルです(関連付け付き):
Lead.php
class Lead extends AppModel {
public $name = 'Lead';
/* Relazioni */
public $belongsTo = array('User', 'Service');
}
ユーザー.php
class User extends AppModel {
public $name = 'User';
/* Relazioni */
public $hasOne = 'Profile';
public $belongsTo = 'Role';
public $hasMany = array(
'Lead' => array(
'className' => 'Lead'
)
);
}
Profile.php
class Profile extends AppModel {
public $name = 'Profile';
/* Relazioni */
public $belongsTo = 'User';
public $hasMany = array(
'Address' => array(
'className' => 'Address'
)
);
}
Address.php
class Address extends AppModel {
public $name = 'Address';
/* Relazioni */
public $belongsTo = 'Profile';
}
Service.php
class Service extends AppModel {
public $name = 'Service';
}
複数の mysql テーブルに保存する必要があるフォームがあります。
これは、フォームの下書きに使用するコードです。
<?php
echo $this->Form->create(null, array(
'inputDefaults' => array(
'error' => false
)
)
); //create(false) per il form senza il modello
echo $this->Form->input('User.Profile.name', array(
'label' => array(
'class' => 'name-form',
'text' => 'Nome:'
),
'style' => 'width:238px;',
'div' => 'field'
)
);
echo $this->Form->input('User.Profile.surname', array(
'label' => array(
'class' => 'name-form',
'text' => 'Cognome:'
),
'style' => 'width:238px;',
'div' => 'field'
)
);
?>
<div class="clear"></div>
<?php
echo $this->Form->input('User.email', array(
'label' => array(
'class' => 'name-form',
'text' => 'Email:'
),
'div' => 'field',
'class' => 'input-xlarge'
)
);
echo $this->Form->input('User.Profile.Address.telephone', array(
'label' => array(
'class' => 'name-form',
'text' => 'Telefono:'
),
'div' => 'field'
)
);
?>
<div class="clear"></div>
<?php
echo $this->Form->input('Lead.service_id',
array(
'label' => array(
'class' => 'name-form',
'text' => 'Servizio richiesto:'
),
'div' => 'field',
'type' => 'select',
'options' => $services
)
);
echo $this->Form->input('Lead.location', array(
'label' => array(
'class' => 'name-form',
'text' => 'Vicino a:'
),
'div' => 'field',
'class' => 'input-xlarge'
)
);
?>
<div class="clear"></div>
<?php
echo $this->Form->input('Lead.message', array(
'label' => array(
'class' => 'message-form',
'text' => 'Richiesta:'
),
'div' => 'field',
'class' => 'form-field',
'type' => 'textarea'
)
);
echo $this->Form->button('Invia Richiesta', array(
'type' => 'submit',
'class' => 'submit-btn less-margin'
)
);
echo $this->Form->end();
?>
そして、これはデータを保存するコントローラー (PagesController) のアクションです。
public function home()
{
if ($this->request->is('post'))
{
$this->loadModel('Lead');
$this->request->data['Lead']['ip'] = $_SERVER['REMOTE_ADDR'];
$this->request->data['Lead']['date'] = date('Y-m-d H:i:s');
$this->request->data['User']['role_id'] = 3;
$this->Lead->set($this->request->data);
debug($this->request->data);
if ($this->Lead->validates())
{
// Dati nel modulo corretti
debug($this->Lead->saveAll($this->request->data, array('deep' => true)));
}
else
{
// Errore nella validazione
$this->Session->setFlash('Completare correttamente il form', 'default', array('class' => 'errore'), 'lead');
$errors = $this->Lead->validationErrors;
debug($errors);
}
}
$this->loadModel('Service');
$this->set('services', $this->Service->find('list'));
}
そして、これは FORM から生成された出力です。
array(
'User' => array(
'Profile' => array(
'name' => 'The Name',
'surname' => 'The Surname',
'Address' => array(
'telephone' => 'The Telephone'
)
),
'email' => 'the@email.com',
'role_id' => (int) 3
),
'Lead' => array(
'service_id' => '1',
'location' => 'The location',
'message' => 'This is the request',
'ip' => '127.0.0.1',
'date' => '2013-01-01 08:07:42'
)
)
問題:
1つのことを除いて、すべて正常に機能します...saveAll()
すべてのデータを(各モデルで)正しく保存しますが、アドレステーブルでは、CakePhpがprofile_idを挿入し、このフィールドのみが表示されますが、FORMから生成された配列でわかるように、電話もあります!
Cakephp が電話フィールドも挿入しないのはなぜですか?
ありがとうございました