我有一个活动管理应用,活动所有者可以导入电子邮件地址列表以添加到他们的活动中。应用程序应为每个电子邮件地址创建一个成员记录,然后创建一个将每个新成员链接到事件的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功能(自动连接和递归查找,级联删除等)工作得很好。
感谢您的见解!
答案 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的问题:)