Нахождение результата по `user_id` на основе двух логических значений laravel - PullRequest
0 голосов
/ 07 января 2020

У меня есть таблица orders, из которой я хочу получить данные против user_id на основе двух логических значений, а именно (is_paid и is_cancelled). Результат принесет мне все ордера user_id, которые is_paid = true или is_cancelled = true. Вот мой запрос.

$query = orders::select('id','user_id','order_amount','created_date_and_time','order_address', 
                'is_cancelled','is_paid')
                ->Where('user_id', '=', $user_id)
                ->Where('is_paid', '=', true)
                ->orWhere('is_cancelled')
                ->get();

Запрос работает отлично, но он также дает мне заказы, когда я передаю id пользователя, у которого нет заказов в состоянии is_paid или is_cancelled = true. Условие orWhere всегда дает результаты, даже если передано id пользователя без заказов. Любая помощь будет по достоинству оценена TIA.

Ответы [ 2 ]

1 голос
/ 07 января 2020

Поскольку ваш код условия изменится на raw sql будет

where user_id = ? and is_paid = true or is_cancelled = true

, вам нужно изменить его на:

where user_id = ? and (is_paid = true or is_cancelled = true)

Использовать при закрытии:

orders::select('id','user_id','order_amount','created_date_and_time','order_address', 
                'is_cancelled','is_paid')
                ->where('user_id', '=', $user_id)
                ->where(function($q) {
                     $q->where('is_paid', true)->orWhere('is_cancelled', true);
                })
                ->get();
0 голосов
/ 07 января 2020

Последний запрос генерируется неправильно. Он проверяет

where user_id = $user_id and is_paid = true or is_cancelled = true

Существующее состояние:

A && B || C

Обязательное условие:

A && (B || C)

Исправленный запрос приведен ниже.

$query = orders::select('id','user_id','order_amount','created_date_and_time',
                'order_address','is_cancelled','is_paid')
                ->where('user_id', $user_id)
                ->where(function($subQuery) {
                    $subQuery->where('is_paid', true)
                    ->orWhere('is_cancelled', true);
                })->get();
...