CakePHP自定义查找器,用于belongsToMany关联

时间:2019-06-06 18:06:46

标签: cakephp cakephp-3.0

我无法通过连接表上的行为将自定义查找器应用于与CakePHP 3.x的belongsToMany关联。

我的主模型Assessment可以有多个UnableToCompleteReasons,并且我使用muffin/trash行为对联接表AssessmentUtcReasons进行软删除支持。

    $this->belongsToMany('UnableToCompleteReasons', [
        'joinTable' => 'AssessmentUtcReasons',
        'foreignKey' => 'AssessmentLogId',
        'targetForeignKey' => 'UtcReasonId',
        'through' => 'AssessmentUtcReasons',
        'saveStrategy' => 'replace',
    ]);

从技术上讲,该协会在这里可以正常工作。删除的UnableToCompleteReasons关联不会返回您期望的Assessment模型。

我的问题是我还必须返回删除的记录,包括所有联接数据,而且我无法从我的withTrashed行为中使用muffin/trash查找程序AssessmentUtcReasons表对象。

使用full查找程序时,我想将withTrashed查找程序应用于联接表-因为UnableToCompleteReasons表不使用软删除。

这基本上就是我要去的地方

public function findFull(Query $query, $options)
{
    return $query->contain([
            'UnableToCompleteReasons' => function ($q) {
                // These finders should be on the JOIN table
                return $q->find('withTrashed')->find('ordered');
            },
        ]);     
    }
}

我已经尝试了所有可以想到的方法,例如在关联上使用finder选项,但是所有方法似乎仅适用于另一个表,而不适用于联接表。

我也无法在文档中找到任何内容,因此,如果我错过了什么,请原谅。谢谢!

1 个答案:

答案 0 :(得分:1)

我想您会发现自己要么与联接表创建了具体的关联,即Assessment hasMany AssessmentUtcReasons关联,以便可以直接包含联接表的关联,例如:

$query->contain([
    'AssessmentUtcReasons' => function ($q) {
        return $q
            ->find('withTrashed')
            ->find('ordered')
            ->contain('UnableToCompleteReasons');
    },
]);

,或者在适用的情况下,将行为/发现者移至UnableToCompleteReasons表类中。