CakePHP 2.4 saveAssociated 不保存所有 children 元素
CakePHP 2.4 saveAssociated not saving all children elements
问题概要:
(CakePHP v2.4.2)当我使用 saveAssociated(或 saveAll,相同的结果)输入具有多个 child 元素的 hasMany/belongsTo 关系的新记录时,只有最后一个 child 元素获取已保存,因为它插入第一个元素,但随后对后续元素执行更新。
我在同一个应用程序中出于非常相似的目的使用了 saveAssociated 并且没有遇到任何问题,所以我感到困惑。
对所有这些工作的查询都很好,即,我得到与每个 parent.
关联的多个 children
模型简介:
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
这显然将最后一个元素保留为要保存的元素,其他元素 over-written 通过更新。
提前感谢您的指点。
您最好遵守约定,id
作为外键?不,真的,不要那样做!
在任何情况下,您都必须将主键列名称告知您的 SiteUser
模型,以防它不符合约定。参见 Cookbook > Models > Model Attributes > primaryKey
class SiteUser extends AppModel {
public $primarykey = 'rowid';
// ...
}
虽然将其设置为 rowid
很可能会解决问题,但我再次建议坚持命名约定!
问题概要: (CakePHP v2.4.2)当我使用 saveAssociated(或 saveAll,相同的结果)输入具有多个 child 元素的 hasMany/belongsTo 关系的新记录时,只有最后一个 child 元素获取已保存,因为它插入第一个元素,但随后对后续元素执行更新。 我在同一个应用程序中出于非常相似的目的使用了 saveAssociated 并且没有遇到任何问题,所以我感到困惑。 对所有这些工作的查询都很好,即,我得到与每个 parent.
关联的多个 children模型简介:
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
这显然将最后一个元素保留为要保存的元素,其他元素 over-written 通过更新。
提前感谢您的指点。
您最好遵守约定,id
作为外键?不,真的,不要那样做!
在任何情况下,您都必须将主键列名称告知您的 SiteUser
模型,以防它不符合约定。参见 Cookbook > Models > Model Attributes > primaryKey
class SiteUser extends AppModel {
public $primarykey = 'rowid';
// ...
}
虽然将其设置为 rowid
很可能会解决问题,但我再次建议坚持命名约定!