Habtm | habtm な関係にあるモデルで、両方とも未登録なデータを同時に保存したい

196 views
Skip to first unread message

custar

unread,
Jun 28, 2009, 8:19:39 AM6/28/09
to CakePHP-ja
(1) Revisitng saveAll() and HABTM
http://teknoid.wordpress.com/2009/03/30/revisitng-saveall-and-habtm/
(2) Notes on CakePHP HABTM (Part 2, saving data)
http://teknoid.wordpress.com/2008/07/11/notes-on-cakephp-habtm-part-2-saving-data/

(1),(2) では、一方のモデルは既にデータをもっている状態での話。

では、一回の保存メソッドの呼び出しで、
両モデルとも全くの新規データを同時に保存し、
しかもその組み合わせも同時に保存できないか?

saveAll() や __saveMulti() を読んでみたが、できないみたい。

取り敢えずは、一方を保存後、通常通り別 model->save() すれば事は済みそう。

custar

unread,
Jun 28, 2009, 9:52:02 AM6/28/09
to CakePHP-ja
__saveMulti() の以下の部分でできてよさそうなもんだが。

//model.php
function __saveMulti($joined, $id)
{
...
if (!empty($newData))
{
foreach ($newData as $data)
{
$key = $this->hasAndBelongsToMany[$assoc]['foreignKey'];
$data[$key] = $id;
$this->{$join}->create($data);
$this->{$join}->save();
}
}

custar

unread,
Jun 28, 2009, 2:19:09 PM6/28/09
to CakePHP-ja
BsC から見れば B, C は親なので、saveAll() が使える。
以下で、未登録な B, C のデータを保存し、そのまま joinTable にも登録できる。

//b.php
public function save($data = null, $validate = true, $fieldList = array
())
{
$this->BsC->bindModel(
array(
'belongsTo' => array(
'B' => array(
'foreignKey' => 'b_id',
'type' => 'INNER',
'conditions' => array('BsC.b_id = B.id')
),
'C' => array(
'foreignKey' => 'c_id',
'type' => 'INNER',
'conditions' => array('BsC.c_id = C.id')
)
)
)
);

return $this->BsC->saveAll($data);
}
Reply all
Reply to author
Forward
0 new messages