TL;DR: beforeSaveでassociatedを書き換えるときは、ドット記法は使えないので配列で指定する。
Authors
hasMany Posts
hasMany Comments
のリレーションがあるとする。
Authorsから、Posts、Commentsをまとめてsaveしたい場合、通常のsaveであればassociated
に指定してやればよい。
$this->Authors->save($author, [
'associated' => ['Posts.Comments'],
]);
通常はこれでよいとして、特殊な要件により通常はPostsまでの保存で、あるときだけCommentsも保存すると言った場合、Model.beforeSave
イベントにフックしてassociatedを書き換えることを検討する。
単純に以下のコードでは動かない。
// Listenerクラスで
public function beforeSave(Event $event, EntityInterface $entity, ArrayObject $options)
{
$table = $event->getSubject();
if ($table instanceof AuthorsTable) {
$options['associated'][] = 'Posts.Comments';
}
return true;
}
上記だと InvalidArgumentException : Cannot save Posts.Comments, it is not associated to Authors
と怒られる。
なぜならば associated
オプションはbeforeSaveに入る前に正規化されているため、ドット記法ではなく以下のように配列化しておく必要がある。
public function beforeSave(Event $event, EntityInterface $entity, ArrayObject $options)
{
$table = $event->getSubject();
if ($table instanceof AuthorsTable) {
$options['associated']['Posts'][] = 'Comments';
}
return true;
}
AOBq9Ni2wsp
BUvl0UFRZmn
otCJpTp5VHg
BeMdGndR9yN
T8FTXqRAZUt
OXcAYOUUIH2
dEQOSuI3ccG
TA17K4qZzLB
xMYr6npQTtM
O8PG7Gim2DZ
SxPaeetKBmC
Pj4SZzWBrBK
QcWLH4ARdID
Z2d2WLL3ySS
AtYESGDxgS1
rdLXyKWSMGL
7mVG4zVsSPR
VV9sGXoauuT
Ael2bL1wCnU
DdkAiYdxhyw
6rcKfamBGyJ
jii9kmZky1k
oQqhrtTEbmk
UGmJuwX5cAp
P6GUP3hFNjU
JRWY6OkuWde
uwVB1lNNiA1
fz9kVD4GXgG
se5GJDkIF5X
454pChrVTiQ
g2BQgwSQDVX
sZPLrOETuxF
Ol6q7u5BzuE
3gHLWj1I9EY
I7eB8HZbMR6
HQIdlHmFpBT
lShLXIjzFPl