您的位置:首页 > 编程语言 > PHP开发

CakePHP - 使用matching & join匹配关联数据

2017-10-26 15:16 483 查看
在获取Primary Model数据及其关联数据时,可以使用
matching
join
从句对关联数据进行匹配。

matching

匹配指定的关联数据,但结果集中并不包含关联数据。

INNER JOIN连接查询,可使用
distinct()
方法去除重复数据。


匹配的关联数据保存在Entity的
_matchingData
属性中。


使用
notMatching
执行相反的操作,LEFT JOIN查询,可与
matching
结合使用。


//Authors HasMany Articles
$query = $this->Authors->find();
$query->matching('Articles', function($q) {
return $q->where(['Articles.created >=' => new DateTime('-10 days')]);
});

//Deep associations
$query = $this->Products
->find()
->matching('Shops.Cities.Countries', function($q) {
return $q->where(['Countries.name' => 'China']);
}
)
->distinct(); //去重

//Using passed variables
$username = 'jack';
$query = $this->Articles->find()->matching('Comments.Users', function($q) use ($username) {
return $q->where(['username' => $username]);
});


innerJoinWith

作用同
matching
,但没有额外的字段及
_matchingData
属性被添加到结果集中。


leftJoinWith

Don’t load any columns from the specified associations into the result set

//查询Primary Model数据及统计关联表记录数
$query = $articlesTable->find();
$articles = $query
//->select($articlesTable)
->select([
'comments_count' => $query->func()->count('Comments.id')
])
->leftJoinWith('Comments')
->group(['Articles.id'])
->having(['comments_count >' => 10]) //设置查询条件
->enableAutoFields(true) //作用同select($articlesTable)
->all();

//Deep associations
$query = $authorsTable
->find()
->select(['total_articles' => $query->func()->count('Articles.id')])
->leftJoinWith('Articles.Tags', function($q) {
return $q->where(['Tags.name' => 'CakePHP']);
})
->group(['Authors.id'])
->enableAutoFields(true);


where
having
的区别


-
where
是从数据表中的字段直接进行筛选;

-
having
是从之前的查询字段中进行筛选;

-
having
常常和
group
分组查询组合使用;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息