@bdFregat

Как в Yii2 фильтровать по записям, которы нет в связанной таблице?

Есть таблица клиентов и таблица транзакций с полем ID клиента.
Мне надо получить получить "плохих" клиентов - тех, кто ни разу не покупал за определенный промежуток времени. То есть надо найти клиентов, для которых не существует транзакций, удовлетворяющих определенному условию.

Пробовал так
$sub = Transaction::find()
            ->select('client_id')
            ->where(['>', 'amount', 0])
            ->andWhere(['brand_id' => $brand])
            ->andWhere(['between', 'created_at', $start_date, $end_date])

//$sub->count() - Находит 2882 транзакции, пользователей никак не меньше

$result = Client::find()
            ->where(['brand_id' => $brand])
            ->andWhere(['not exists', $sub]) // Без этой строчки - 3794, это все пользователи
            ->indexBy('id')
            ->asArray()
            ->count();
// Получаем 0, хотя должно быть не меньше 3794 - 2882


Что я делаю не так?
  • Вопрос задан
  • 167 просмотров
Решения вопроса 1
@bdFregat Автор вопроса
Закрываю вопрос, проблема оказалась в том, что ActiveRecord возвращает id с типом string, есть мнение, что это из-за типа данных unsigned int. Если id приходят в int, то всё работает на ура.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
slo_nik
@slo_nik Куратор тега Yii
Доброе утро.
Возможно надо изменить строку
->andWhere(['not exists', $sub])
На
->andWhere(['not in', 'id', $sub])

p.s. Что у Вас в $sub попадает? Как я понимаю там должен быть массив id клиентов, которые ничего не покупали?

p.s. Запрос тоже не мешало бы изменить.

$sub = Transaction::find()
            ->where(['>', 'amount', 0])
            ->andWhere(['brand_id' => $brand])
            ->andWhere(['between', 'created_at', $start_date, $end_date])
           ->column();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы