匹配的关联和没有关联的记录 cakephp 3
Posted
技术标签:
【中文标题】匹配的关联和没有关联的记录 cakephp 3【英文标题】:matching associations and no associated record cakephp 3 【发布时间】:2016-02-05 11:29:47 【问题描述】:我有一个Price
的关联属于Season
我正在尝试查询当季过去时与特定日期范围匹配的所有价格以及没有的价格 (Prices.season_id=0
)
这是我所拥有的:
// build the query
$query = $this->Prices->find()
->where(['product_id'=>$q['product_id']])
->contain(['Seasons']);
if(!empty($to_date) && !empty($from_date))
$query->matching('Seasons', function ($q)
return $q->where([
'from_date <= ' => $to_date,
'to_date >= ' => $from_date
]);
);
但是,这只会返回与季节明确关联的价格。如何让它也返回 Prices.season_id=0?
【问题讨论】:
【参考方案1】:$query->matching()
调用在内部创建一个 INNER JOIN
并将回调函数的 where 语句放入连接的 ON
子句中。要检索没有关联的项目,您需要LEFT JOIN
。所以你的 coden-p 看起来像这样:
if(!empty($to_date) && !empty($from_date))
$query->leftJoinWith('Seasons', function ($q)return $q;);
$query->where([[
'or' => [
'Season.id IS NULL',
[
'from_date <= ' => $to_date,
'to_date >= ' => $from_date,
],
],
]]);
所以我们创建一个普通的INNER JOIN
并将条件放在查询的普通(最外层)where
子句中。
双精度数组用于消除可能具有or
连接的其他条件。
我自己偶然发现了 column IS NULL
而不是 'column' => null
语法。
PS:这适用于所有协会。对于hasMany
和belongsToMany
,您必须将结果与$query->group('Prices.id')
分组
【讨论】:
以上是关于匹配的关联和没有关联的记录 cakephp 3的主要内容,如果未能解决你的问题,请参考以下文章