Создайте запрос для фильтрации результатов по нескольким ассоциациям данных с логическим разделением - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь отфильтровать результаты таблицы на основе двух связанных таблиц, используя логическую дизъюнкцию (ИЛИ).

Например, я хочу найти все Products фильтрации для Reviews и Reviews.Users.

, где Reviews.Users.super равно ->eq(true)

ИЛИ

, где Reviews.visibility равно ->eq('visibility', 'public') И Reviews.published равно ->isNotNull('published')

с использованием двух ->innerJoinWith создает конъюнкцию.

this->Products->find()
  ->distinct()
  ->where(['Products.status' => 'current'])
  ->contain(['Reviews.Users'])
  ->innerJoinWith('Reviews', function($q) {
      return $q
        ->where(['Reviews.visibility' => 'public'])
        ->andWhere(['Reviews.published IS NOT' => null]);
    })
  ->innerJoinWith('Reviews.Users', function($q) {
      return $q
        ->where(['Users.super' => true]);
})
->all();

при попытке использовать leftJoin s в соответствии с предложением @ndm я получаю

$this->Products->find()
  ->leftJoinWith('Reviews')
  ->leftJoinWith('Reviews.Users')
  ->where([
    'OR' => [
       'Reviews.Users.super' => true,
       'Reviews.visibility' => 'public'
     ]
  ])
  ->andWhere([
     'Reviews.published IS NOT' => null
   ])

Столбец не найден: 1054 Неизвестный столбец 'Reviews.Users.super' в 'предложении where'

...