CakePHP3: добавление ассоциации в поведение - PullRequest
0 голосов
/ 25 мая 2018

У меня есть таблица с названием settings, которая содержит типичную информацию о настройках, например, isactive, активацииdate, ... которая должна быть связана со многими другими объектами.Теперь мне было интересно, смогу ли я поместить это в SettingsBehavior, чтобы мне просто нужно было загружать Поведение во всех объектах таблицы, которые мне нужны.Я думал добавить что-то вроде этого в SettingsBehavior::beforeFind():

$event->getSubject()
            ->hasOne('Settings')
            ->setName('Settings')
            ->setForeignKey('parent_id')
            ->setConditions(['Settings.parenttype' => $event->getSubject()->getTable()]);

Но запрос уже создан.По крайней мере, я могу добавить установочную сущность к сущности, используя SettingsBehavior.В Поведениях initialize() насколько я знаю, у меня нет ссылки на предмет.Затем я попытался сделать это в SettingsBehavior::beforeFind():

$query->leftJoin('Settings', [
                $event->getSubject()->getAlias() . '.id = Settings.parent_id',
                'Settings.parenttype' => 'users'
            ]);

Но это также не добавило настройки для моего найденного объекта.Кто-нибудь пробовал что-то похожее, или есть идея, как это сделать?Может быть, я даже ошибаюсь, пытаясь сделать что-то подобное через поведение?Спасибо!

1 Ответ

0 голосов
/ 25 мая 2018

Таблица (субъект, как вы ее назвали), к которой привязывается поведение, внедряется через конструктор поведения и сохраняется в свойстве _table, которое можно использовать в методе initialize().

public function initialize(array $config)
{
    // ...
    $this->_table->hasOne('Settings', /* ... */);
}

Затем вы можете содержать или присоединиться к ассоциации в поведении beforeFind() обратного вызова.

public function beforeFind(Event $event, Query $query, \ArrayObject $options)
{
    // ...
    $query->contain('Settings');
}
...