Mysql 多级联接中数组上的Cakephp 3.x筛选器行

Mysql 多级联接中数组上的Cakephp 3.x筛选器行,mysql,cakephp-3.0,query-builder,Mysql,Cakephp 3.0,Query Builder,我的数据库的第一个重要结构: teachers: id, int username, varchar certificates: id, int teacher_id, int vality_date, date languages: id, int certificate_id, int language_id, int 教师hasMany证书hasMany语言 教师可以拥有多种语言的多个证书。可以在多个证书上拆分多种语言 我试图找到一种cakephp方法来获取所有教师,他们拥有定义语言

我的数据库的第一个重要结构:

teachers:
id, int
username, varchar

certificates:
id, int
teacher_id, int
vality_date, date

languages:
id, int
certificate_id, int
language_id, int
教师
hasMany
证书
hasMany
语言

教师可以拥有多种语言的多个证书。可以在多个证书上拆分多种语言

我试图找到一种cakephp方法来获取所有教师,他们拥有定义语言的有效证书,可能有多个证书,但很难用cakephp构建查询。我试了这么多,但我总是得到老师谁拥有所有或只有一个要求的语言


你将如何解决这个问题

您可以通过连接(或者使用QueryBuilder调用的
matching()
)来实现这一点

如果您想使用:

$teachers = $this->Teachers->find()
    ->innerJoinWith('Certificates.Languages');
…你会得到一个教师表,每个教师都有证书,每个证书都有语言。可能还会有副本

现在,您可以对关联的数据进行筛选(并防止重复):

我不确定这是否会直接起作用,但肯定是这样的

关键字中的SQL
可用于限制数组的值。或者,您可以构造多个
语句(无论出于何种原因)。
还请注意,我个人更喜欢
…JoinWith
而不是
匹配
(没有真正的原因)


为了完整起见,使用
matching()
时,它看起来像:

$lang_list = ['NL', 'DE'];
$teachers = $this->Teachers->find()
    ->matching('Certificates.Languages', function ($q) use ($lang_list) {
        return $q->where(['lang IN' => $lang_list]);
    });

您可以通过连接(或者使用QueryBuilder所称的
匹配()
来实现这一点

如果您想使用:

$teachers = $this->Teachers->find()
    ->innerJoinWith('Certificates.Languages');
…你会得到一个教师表,每个教师都有证书,每个证书都有语言。可能还会有副本

现在,您可以对关联的数据进行筛选(并防止重复):

我不确定这是否会直接起作用,但肯定是这样的

关键字中的SQL
可用于限制数组的值。或者,您可以构造多个
语句(无论出于何种原因)。
还请注意,我个人更喜欢
…JoinWith
而不是
匹配
(没有真正的原因)


为了完整起见,使用
matching()
时,它看起来像:

$lang_list = ['NL', 'DE'];
$teachers = $this->Teachers->find()
    ->matching('Certificates.Languages', function ($q) use ($lang_list) {
        return $q->where(['lang IN' => $lang_list]);
    });