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 很可能会解决问题,但我再次建议坚持命名约定!