问题简介: (CakePHP v2.4.2)当我使用saveAssociated(或saveAll,相同的结果)输入具有与多个子元素的hasMany / belongsTo关系的新记录时,只保存最后一个子元素,因为它插入第一个元素,但是为后续元素执行UPDATES。 我在同一个应用程序中使用saveAssociated用于非常相似的目的并且没有问题,所以我感到很困惑。 对所有这些工作的查询工作正常,即我得到了与每个父项相关联的多个子项。
模型简介:
class Site extends AppModel {
// sites columns: id (primary key), bunch of others
public $hasMany = array(
'SiteUser' => array(
'className' => 'SiteUser',
'foreignKey' => 'id', // Yes, I would have preferred 'site_id', lost battle
'dependent' => true
)
);
}
class SiteUser extends AppModel {
// site_users columns: rowid(PK), id (FK to sites), name
public $belongsTo = array(
'className' => 'Site',
'foreignKey' => 'id'
);
}
等效请求数据(从表单处理):
$site_data = array(
'Site' => array('field1' => 'value1', 'field2' => 'value2' ),
'SiteUser' => array(
array('name' => 'Jane Doe'),
array('name' => 'John Doe'),
array('name' => 'Moe Money')
)
);
在控制器中:
unset($this->Site->SiteUser->validate['id']);
$saved_site = $this->Site->saveAssociated($site_data);
结果: 所有站点数据都按预期保存。仅保存最后一个SiteUser元素(示例中为Moe Money)。无论SiteUser中的元素数量是多少,这都是相同的,即只保存最后一个元素。
SQL日志: 它执行
INSERT INTO site_users (`name`, `id`) VALUES ('Jane Doe', 1)
但随后执行
UPDATE site_users SET 'name' = 'John Doe', 'id' = 1 WHERE site_users = 1
UPDATE site_users SET 'name' = 'Moe Money', 'id' = 1 WHERE site_users = 1
这显然将最后一个元素保留为保存的元素,其他元素则被更新覆盖。
提前感谢任何指示。
答案 0 :(得分:0)
你最好坚持约定,id
作为外键?不,真的,不要那样做!
在任何情况下,如果不符合约定,您必须告知SiteUser
模型主键列名称。请参阅 Cookbook > Models > Model Attributes > primaryKey
class SiteUser extends AppModel {
public $primarykey = 'rowid';
// ...
}
虽然将此设置为rowid
很可能会解决问题,但我再次建议坚持使用命名约定!