我有Price
belongsTo 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
]);
});
}
但是,这只会返回与季节明确关联的价格。如何让它返回Price.season_id = 0?
答案 0 :(得分:0)
$query->matching()
调用在内部创建INNER JOIN
,并将回调函数的where-statements放入连接的ON
子句中。要检索没有关联的项目,您需要LEFT JOIN
。所以你的codesnippet看起来像这样:
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')