1

私は属しているの関連付けを持ってい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
    ]);
  });
}

ただし、これは Season に明示的に関連付けられた Price のみを返します。Price.season_id=0 も返すようにするにはどうすればよいですか?

4

1 に答える 1

0

この$query->matching()呼び出しは内部的に を作成しINNER JOIN、コールバック関数の where ステートメントをON結合の句に配置します。関連付けなしでアイテムを取得するには、LEFT JOIN. したがって、コードニペットは次のようになります。

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句に条件を配置します。

double 配列は、おそらく他の場所でのor接続条件のあいまいさを解消するためのものです。

私自身、構文のcolumn IS NULL代わりにつまずきました。'column' => null

PS: これはすべての関連付けで機能します。ForhasManyそしてbelongsToMany、結果をグループ化する必要があります$query->group('Prices.id')

于 2016-10-28T23:14:39.227 に答える