我有一个名为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'
]);
但它也没有为我找到的实体添加设置。有没有人尝试过类似的东西,或者知道如何做到这一点?也许我通过一种行为试图做这样的事情甚至是错误的? 谢谢!
答案 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');
}