我使用 CakePHP 2.2.4 有一个非常奇怪的问题,让我解释一下发生了什么 .
我有这些mysql表:
leads
+------------+--------------+------+-----+---------+----------------+
| 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 | |
+------------+--------------+------+-----+---------+----------------+
users
+---------+--------------+------+-----+---------+----------------+
| 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 | |
+---------+--------------+------+-----+---------+----------------+
profiles
+---------+--------------+------+-----+---------+----------------+
| 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 | |
+---------+--------------+------+-----+---------+----------------+
addresses
+------------+--------------+------+-----+---------+----------------+
| 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 | |
+------------+--------------+------+-----+---------+----------------+
roles
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
services
+-------+--------------+------+-----+---------+----------------+
| 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');
}
User.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表中的表单 .
这是我用来起草FORM的代码:
<?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'
)
)
PROBLEM:
一切正常,除了一件事...... saveAll()
正确保存所有数据(在每个模型中),但在地址表中我只看到CakePhp插入 profile_id ,只有这个字段,但正如你在数组中看到的那样FORM,我也有电话!
为什么cakephp不会插入 telephone 字段?
谢谢
2 回答
你正在编写代码,因此它不起作用 .
在蛋糕文档中没有任何地方说它使用以下代码:
不正确
你不能只把字串在一起,希望最好 . 你可以使用:
正确
没有其他有效的方法来输入字段 .
而不是弄清楚,阅读docs
“saveAll函数只是saveMany和saveAssociated方法的包装器 . ”
请尝试使用
saveAssociated
,以便强制使用saveAssociated
方法 . 仍然通过array('deep'=>true);
. 输出格式化的方式,可能是尝试自动使用saveMany
.此外,如果您对模型中的
telephone
字段进行了验证,那么它将失败,因为您的字符串中不包含任何数字 .The Telephone
. 或者,您可以传递'validate' => false
选项 .