2010-05-11 125 views
2

我在处理cakephp中的间接关联模型时遇到了一些问题。我目前的模型设置如下:CakePHP:间接关联模型的缺点

Deliveries hasOne License 
License belongsTo Delivery 
License hasAndBelongsToMany Product (and vice-versa) 
License hasAndBelongsToMany ProductOption (and vice-versa) 

我试图保存有关所有这些模型内一个窗体的信息。我遇到的缺点如下:

  1. 表单助手似乎只能看到字段类型深一级。

  2. saveAll()似乎只能将记录保存到一个深度级别(对于多个模型表单)。

我到处搜寻,为解决这些问题,但由于我是新来CakePHP的,我不知道有什么最新的方法或“正确”的方法是处理这些问题。

任何意见是非常感谢。谢谢你们!

编辑:我已经发布代码到我的失败尝试在这里:http://bin.cakephp.org/saved/58501

+0

你能从你的表单发布一些代码吗?在这种情况下,License也意味着什么? – jimiyash 2010-05-11 23:57:53

+0

我的公司通常对软件“许可证”进行物理“交付”,使客户可以运行他们购买的不同类型的软件“产品”以及购买的“产品选项”。 – Dan 2010-05-12 00:14:41

回答

0

白水()似乎只能够保存记录的一个深层次(多个模型的形式)。

我在过去偶然发现了这个限制,并选择了在当时通过将我的表格拆分为多个更小的表格来解决它。

使用saveAll和InnoDB表时需要注意的一件事是您可以获得原子事务,因为如果Cake无法将更改提交到数据库,它将执行回滚。

所以,虽然你可以很明显地用你自己的代码的几行解决问题(因为Cake的saveAll单行不符合预期),如果事务是一个需求,你将不得不花更多的时间。

0

嗨,我知道这是一个旧的帖子,但我认为我会张贴这个来帮助他人,至于CakePHP 2.1,您可以使用saveAll()调用一个选项保存多级模型关联: http://book.cakephp.org/2.0/en/appendices/new-features-in-cakephp-2-1.html#model-saveall-model-saveassociated-model-validateassociated

例子:

$this->MyModel->saveAll($this->request->data, array('deep'=>true)); 

对于表单助手的限制,我像失去了有你在,我可能会采取手动设置输入类型,我的领域并不需要太多的验证。