【问题标题】:CakePHP3: Adding an association in a behaviorCakePHP3:在行为中添加关联
【发布时间】:2018-05-25 09:55:49
【问题描述】:

我有一个名为 settings 的表,其中包含典型的设置信息,如 isactive、activationdate 等,它们应该与许多其他实体相关联。现在我想知道是否可以将它放在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'
            ]);

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

【问题讨论】:

  • 好吧,玩了一圈,我发现SettingsBehavior::beforeFind() 中的以下代码可以工作:$event->getSubject() ->hasOne('Settings') ->setName('Settings') ->setForeignKey('parent_id') ->setConditions(['Settings.parenttype' => $event->getSubject()->getTable()]); $query->contain(['Settings']); 我的实体现在包含一个设置。

标签: associations cakephp-3.0 behavior


【解决方案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');
}

【讨论】:

    猜你喜欢
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多