匹配关联,没有相关记录cakephp 3

时间:2016-02-05 11:29:47

标签: orm associations matching cakephp-3.1

我有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?

1 个答案:

答案 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:这适用于所有协会。对于hasManybelongsToMany,您必须使用$query->group('Prices.id')

对结果进行分组