cakephp - 有许多通过不保存

时间:2010-12-07 11:05:27

标签: cakephp

我有以下几种关系

Alert            AlertsElement       Search 
 id               id                  id 
 name             alert_id            link 
                  search_id
                  ordering

以下是我的模特

class Alert extends AppModel {
var $name = 'Alert';
var $hasMany = array('AlertsElement');  

class AlertsElement extends AppModel {
var $name = 'AlertsElement';
var $belongsTo = array('Alert','Search');

class Search extends AppModel {
var $name = 'Search';
var $hasMany = array('AlertsElement');

这是我用来保存的测试代码 -

$d = array();
$d['Alert']['id'] = 1976;
$d['Search']['id'] = 107;
$d['AlertsElement']['ordering'] = 2;
$this->Alert->create();
$this->Alert->saveAll($d);

我收到此错误 -

Cannot use a scalar value as an array [CORE/cake/libs/model/model.php, line 1696]

和alertselement中包含订单但外键设置为0的行条目

有什么想法吗?

谢谢,Alex

2 个答案:

答案 0 :(得分:9)

为了与hasMany保存saveAll关系,hasMany相关联的模型数据(在本例中为$d['AlertsElement'])需要是关联的索引数组数组,因此:

$d = array(
  'Alert' => array(
    'id' => 1976
  ),
  'AlertsElements' => array(
    0 => array(
      'ordering' => 2
    ) 
  )
);
$this->Alert->saveAll($d);

请注意,由'ordering'键及其值组成的关联数组已向下移动到索引数组中。这是在单个hasMany操作中保存saveAll关联数据所需的格式,因为无论您是要保存一个还是十个关联记录,此格式都会正常扩展。

有关详细信息,请参阅saving related model data上的蛋糕手册。

答案 1 :(得分:0)

我来到这里寻找this question的解决方案。不要与Daniel相矛盾,这本书说当你使用hasMany through关系(这是Alex正在使用的)时,你可以通过一次saveAll调用来保存所有三个记录,但是你可以从加入表的模型中这样做:

$data = array(
    [Student] => Array
        (
            [first_name] => Joe
            [last_name] => Bloggs
        )

    [Course] => Array
        (
            [name] => Cake
        )

    [CourseMembership] => Array
        (
            [days_attended] => 5
            [grade] => A
        )

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

除非我误读了这本书,否则该示例应该创建学生,课程和加入CourseMembership记录。也就是说,我还没有能够像记录的那样让它工作。我正在传递课程的ID,因为我正在使用现有课程,但它不会创建学生或课程成员记录。

更多反馈表示赞赏。