CakePHP3:在行为中添加关联

CakePHP3: Adding an association in a behavior

我有一个名为 settings 的 table,它包含典型的设置信息,如 isactive、activationdate...,它们应该与许多其他实体相关联。现在我想知道我是否可以把它放在 SettingsBehavior 中,这样我只需要在我需要的所有 Table 个对象中加载行为。 我考虑过在 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'
            ]);

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

行为被附加到的 table(你称之为主题)通过行为构造函数注入,并存储在 _table 属性 中,你可以在 initialize() 方法中使用。

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

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

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