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');
}
我有一个名为 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');
}