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]);
});