CakePHP如何在一个saveAll中不知道外键的情况下创建hasMany数据?

Posted

技术标签:

【中文标题】CakePHP如何在一个saveAll中不知道外键的情况下创建hasMany数据?【英文标题】:CakePHP how to create hasMany data without knowing the foreign key in one saveAll? 【发布时间】:2012-10-29 03:59:20 【问题描述】:

我希望创建和保存关联数据,就像我对 belongsTo 数据所做的一样 - 关联数据是动态创建的,并且通过一次调用 saveAll 或 saveAssociated 也可以生成并动态保存外部 ID交易内置。

但对于 hasMany 关系中的数据,情况似乎并非如此。以用户和评论为例。评论以 user_id 作为外键。

似乎我无法通过在用户上使用单个 saveAll($data) 来保存用户 $data

Array(
    'name' => 'Jack',
    'email' => 'jack@abc.com',
    'Comment' => array(
         array(
            'title' => 'I like this article.'
         )
    )
)

我阅读了一些文档。看来我需要提到 user_id 作为正确创建 Comment 数据的外键。

如果是这种情况,由于在创建用户 ID 之前我没有用户 ID,看来我需要编写代码让 SAVE 发生两次。

我真的认为我错过了什么。应该有一种 CAKE 方式来做到这一点。

【问题讨论】:

【参考方案1】:

只要您遵循约定并相应地格式化数据,Cake 就会自动完成此操作。对于hasMany关联,主模型数据和关联模型数据需要设置在同级的字符串键上,比如

array
(
    'User' => array(),
    'Comment' => array()
)

还要注意

saveAll 函数只是 saveMany 和 保存关联的方法。它将检查数据并确定什么 它应该执行的保存类型。如果数据格式为数字 索引数组, saveMany 将被调用,否则 saveAssociated 是 用过。

此函数接收与前两个相同的选项,并且是 通常是向后兼容的功能。建议使用 根据具体情况选择 saveMany 或 saveAssociated。

两者都行。

长话短说,模型数据需要通过字符串键进行分隔和索引,它与find() 调用返回的格式基本相同。这样,Cake 就会知道它需要保存相关数据,并会自动插入 Comment 记录的外键。

array
(
    'User' => array
    (
        'name' => 'Jack',
        'email' => 'jack@abc.com'
    ),
    'Comment' => array
    (
        array
        (
            'title' => 'I like this article.'
        )
    )
)

另见

Cookook > Models > Saving Your Data > Associations: Linking Models Together > hasMany

Cookook > Models > Saving Your Data > Model::saveMany()

Cookook > Models > Saving Your Data > Model::saveAssociated()

Cookook > Models > Saving Your Data > Model::saveAll()

【讨论】:

谢谢!我实际上犯了2个错误。一个是你指出的。另一个是一个ossocaited模型中的“notempty”字段规则。我实际上需要这个字段来保存空值。现在它正在工作。 您能否同时对多个用户和每个用户的多个评论执行此操作? 是的,你可以。只需将上面显示的多组数字索引数组传递,并使用 saveMany() 并将 deep 选项设置为 true,请参阅 Cookook > Models > Saving Your Data > Model::saveMany() @geoidesic

以上是关于CakePHP如何在一个saveAll中不知道外键的情况下创建hasMany数据?的主要内容,如果未能解决你的问题,请参考以下文章

在 CakePHP 中使用 saveAll() 保存多个 hasMany 数据,而无需在视图中写入 id

避免 CakePHP 的 saveAll 并使用手动查询

CakePHP saveAll() 函数问题

Cakephp - saveAll 和 beforeSave

CakePHP:用户数据 saveAll 静默失败?

CakePHP 奇怪的 saveAll 问题。返回 true,但在数据库中没有任何内容