@frmax
человек

Как выбрать всех кто не оплатил?

Добрый день,

есть 2 таблицы user/orders

чтоб выбрать всех пользовтелей, которые оплатили я использую hasMany('orders', ['user_id' => 'id'])
а как выбрать всех пользователей у которых нет записей в таблице orders?

интересует ActiveRecord, построение связи
  • Вопрос задан
  • 402 просмотра
Пригласить эксперта
Ответы на вопрос 4
@masterfreelance
программист со стажем
SELECT * FROM user WHERE id not in (SELECT user_id FROM orders GROUP BY user_id)
Ответ написан
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Примерно так:
Model::find()->where('not in', 'id', [array_id])->all();

Подробней здесь
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
1 пользователь имеет несколько заказов, обычно при этом заказы могут быть оплаченные и не оплаченные, поэтому Ваш
hasMany('orders', ['user_id' => 'id'])
просто возвращает массив заказов пользователя, что никак не свидетельствует об оплате.
Обычно в orders есть поле status_id, по которому и можно судить об оплате.
Поэтому предложенный вариант с
Model::find()->where('not in', 'id', [array_id])->all();

просто даст всех пользователей которые не создавали заказ.
Тогда для выбора пользователей с неоплаченными заказами поиск должен быть по таблице order которая имеет связь hasOne с USER, например:
$order = Order::find()->andWhere(['status_id'=>0])->all();
$users = ArrayHelper::getColumn($order,'user');
print_r($users);
Ответ написан
kawabanga
@kawabanga
Как то так, если вам очень нужно через связь. Но по опыту скажу, что иногда проще набирать именно через отдельный запрос .

$user->getOrders()->andWhere('not in', 'id', [array_id])->all();


Так же вы можете массив соответствия задать в самой функции hasMany.
Ответ написан
Ваш ответ на вопрос

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

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