2013-03-27 85 views
-2

我已经遇到了保存蛋糕php中的数据的问题。cakephp为相关模型的相关模型保存数据(而不是打印错误)

这里是模型/关系。

  • 的hasMany 部门
  • 的hasMany

我在其中我允许用户创建多个用于创建新的分区,视图新的部门。在创建每个部门时,用户可以为该部门创建多个组。现在麻烦是我不确定如何保存组数据。

为即时创建的每个部门,即时通讯使用多重索引方法输入(即“Department.0.name”,Department.0.type),所以这将是一个简单的使用saveAll方法。但是,对于创建的每个组,我需要一个department_id,并且由于没有任何区的部门尚未保存,所以他们没有ID。我怎样才能保存这个新区的数据,保存新的部门,以及他们相关的新创建的组?有没有一种方法可以解决创建适当关联的组输入的名称属性,比如“Department.0.Group.0.name”?

在此先感谢!如果有什么不清楚的地方,请不要犹豫,我会很乐意再重述。

回答

2

你的POST数据数组是什么样的?

<?php 

debug($this->data); 

?> 

如果不正确的格式,相关车型将不会得到保存..蛋糕知道抢已尚未保存的车型“lastInsertId()”,所以你不要不必担心那些......我不确定的是,这些文档并没有真正涉及,这个节省有多深。提供的示例如下:

$this->data = 
Array 
(
    [Article] => Array 
     (
      [title] => My first article 
     ) 
    [Comment] => Array 
     (
      [0] => Array 
       (
        [comment] => Comment 1 
        [user_id] => 1 
       ) 
      [1] => Array 
       (
        [comment] => Comment 2 
        [user_id] => 2 
       ) 
     ) 
) 

$this->Article->saveAll($this->data); 

这是保存“的hasMany”关系的关联模型的正确结构(CakePHP的1.3),但我不知道,如果去任何更深比一个孩子。

我想到的一件事就是根据上面的格式构建数组,但将父模型留出。然后手动保存父模型数据,获取:: getLastInsertId();然后对部门和团体进行saveAll。


[UPDATE] 我只是测试你的理论,它会工作你想让你的方式。

<?php 

echo $this->Form->input('Department.0.Group.0.name'); 

?> 

会产生:

<input name="data[Department][0][Group][0][name]" type="text" id="Department0Group0name"> 

[更新2] 我做了一些在LIB /蛋糕/型号/ Model.php探索和发现这一点:

<?php 
... 

public function saveAssociated($data = null, $options = array()) { 
    ... 
    ... // code omitted. 
    ... 
    if ($options['deep']) { // This will recurse infinitely through all associations 
     $saved = $this->{$association}->saveAssociated($values, array_merge($options, array('atomic' => false))); 
    } 
    ... 
    ... 
    ... // code omitted. 
... 
?> 
+0

谢谢!至于saveAll,据我了解,它将保存模型数据和相关的模型数据。所以,在上述情况下,它可以节省所有这些。 saveAll是几个保存方法的包装,其中一个是saveAssociated()。就深度而言,为了保存关联模型相关模型的数据,我相信你可以使用saveAssociated($ data,array('deep'=> true))。我在区域行动的视图内手动创建组的输入。我可以将name属性设置为'',我想知道吗? – Todd 2013-03-27 02:56:20

+0

这似乎是正确的,'深'=>真的吧?我从来没有用过,好主意。我相信你的输入名称是有效的,我相信它会创建正确的结构。 '<?php echo $ this-> Form-> input('Modelname.0.fieldname'); echo $ this-> Form-> input('Modelname.1.fieldname'); ?> > – 2013-03-27 03:07:56

+1

实体深度限制 '在1.2中,有5个嵌套密钥的硬限制。这在某些情况下对表单输入创建造成了很大的限制。在1.3中,现在可以创建无限嵌套的表单元素键。验证错误和值读取的任意深度也已添加.'看起来像限制是无限的:) – 2013-03-27 03:08:15