CakePHP Gurus:我的复杂saveAll场景可能吗?

时间:2011-02-25 20:31:44

标签: cakephp

我有一个活动管理应用,活动所有者可以导入电子邮件地址列表以添加到他们的活动中。应用程序应为每个电子邮件地址创建一个成员记录,然后创建一个将每个新成员链接到事件的EventsMember记录。

使用saveAll()执行此操作的全部原因是(a)最小化SQL调用的数量(每个事件可能有数千个成员,我不想设计导入功能来运行一个每个新成员的SQL语句:),以及(b)利用事务。我愿意采用其他方法来实现这一目标,以利用CakePHP的效率。

所以我从文件中读取列表并创建一个数组以传递给Member模型的saveAll()方法;我知道我可以为每个成员添加如下数组:

$data = Array(
  '0' => Array('email' => 'nobody@nowhere.com'),
  '1' => Array('email' => 'somebody@nowhere.com'),
  ...
);
$this->Member->saveAll($data);

这很好用。但我希望能够同时创建相关的EventsMember记录,但我不确定数据应该采用什么格式,或者甚至是否可能。我试过了:

$data = Array(
  '0' => Array(
    'email' => 'nobody@nowhere.com'),
    'Event' => Array('id' => 10);
  ),
  '1' => Array(
    'email' => 'somebody@nowhere.com'),
    'Event' => Array('id' => 10);
  ),
  ...
);
$this->Member->saveAll($data);

$data = Array(
  '0' => Array(
    'email' => 'nobody@nowhere.com'),
    'Event' => Array(
      '0' => Array('id' => 10);
    )
  ),
  '1' => Array(
    'email' => 'somebody@nowhere.com'),
    'Event' => Array(
      '0' => Array('id' => 10);
    )
  ),
  ...
);
$this->Member->saveAll($data);

但他们都只创建了会员记录,并忽略了嵌入的事件数据。

我知道我的关系正常工作,因为其他CakePHP功能(自动连接和递归查找,级联删除等)工作得很好。

感谢您的见解!

2 个答案:

答案 0 :(得分:1)

好吧,我不是一个cakephp大师,但是在保存关系时,你不应该使用"EventsMember" "Events"(或模型的名称),例如你得Member所以就像

        $data = array(

            'Member' => array('email' => 'johndoe@google.com'),
            'Event' => array( // many events array of records
                'Event' => array('event_id', 1), // this is a new record
                'Event' => array('event_id', 3) // second record to relate to johndoe
            )
        );
$this->Member->saveAll($data);

成员模型将处理所有关系,因此如果成员模型已正确设置关系,就像您提到的那样,它应该有效。

答案 1 :(得分:0)

最后,我必须结合保存多个记录的方法,并按照allenskd的描述保存HABTM记录。这个过程如下:

$data = array(
  '0' => array(
    'Member' => array('email' => 'nobody@nowhere.com'),
    'Event' => array('id' => 10)
  ),
  '1' => array(
    'Member' => array('email' => 'somebody@nowhere.com'),
    'Event' => array('id' => 10)
  ),
  ...
);
$this->Member->saveAll($data);

现在我遇到了一个稍微不同的问题,即如何在EventsMember记录中获取额外信息,但这是different post的问题:)