CakePHP3:在行为中添加关联

时间:2018-05-25 09:55:50

标签: associations cakephp-3.0 behavior

我有一个名为settings的表,其中包含一些典型的设置信息,如isactive,activationdate,......应该与很多其他实体相关联。现在我想知道我是否可以将它放在SettingsBehavior中,这样我只需要在我需要的所有表对象中加载行为。 我想在SettingsBehavior::beforeFind()中添加类似的东西:

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

但是已经创建了Query。至少我可以使用SettingsBehavior向实体添加设置实体。 在行为initialize()据我所知,我没有提及这个主题。 然后我尝试在SettingsBehavior::beforeFind()中执行此操作:

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

但它也没有为我找到的实体添加设置。有没有人尝试过类似的东西,或者知道如何做到这一点?也许我通过一种行为试图做这样的事情甚至是错误的? 谢谢!

1 个答案:

答案 0 :(得分:1)

通过行为构造函数注入要附加行为的表(正如您所称),并将其存储在_table属性中,您可以在initialize()方法中使用该属性

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

然后,您可以在行为beforeFind()回调中包含或加入关联。

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