CakePHP 2.4 saveAssociated不保存所有子元素

时间:2015-03-09 16:21:46

标签: cakephp

问题简介: (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

这显然将最后一个元素保留为保存的元素,其他元素则被更新覆盖。

提前感谢任何指示。

1 个答案:

答案 0 :(得分:0)

你最好坚持约定,id作为外键?不,真的,不要那样做!

在任何情况下,如果不符合约定,您必须告知SiteUser模型主键列名称。请参阅 Cookbook > Models > Model Attributes > primaryKey

class SiteUser extends AppModel {

    public $primarykey = 'rowid';

    // ...

}

虽然将此设置为rowid很可能会解决问题,但我再次建议坚持使用命名约定!