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