Laravel orWhere запрос не работает должным образом - PullRequest
1 голос
/ 06 августа 2020

У меня есть следующий запрос, который работает нормально и дает требуемые результаты

SELECT * FROM `general_ledger` where from_province = 0 and created_at BETWEEN '2020-06-01' and '2020-08-01' or to_province = 0

Мне нужно выбрать строки, в которых столбцы from_province и to_province соответствует параметру запроса Province

В Laravel я использовал следующее:

public function ProvinceOrdersSummery($province,$from_date,$to_date){

        $orders = DB::table('general_ledger as g')
                  ->join('regions as f','g.from_province','=','f.province')
                  ->join('regions as t','g.to_province','=','t.province')
                  ->where('g.from_province',$province)
                  ->whereBetween('g.created_at',[$from_date,$to_date])
                  ->orwhere('g.to_province',$province)
                  ->select('g.order_bar','g.price','g.delivery_cost','g.type','f.ar_name as from_province','t.ar_name as to_province','visual_status','g.created_at')
                  ->get();
        return response()->json(['status_code'=>2000,'data'=>$orders , 'message'=>''],200);

    }

Но он возвращает только строки, когда to_province сопоставьте провинцию параметр

Что здесь не так?

Любая помощь будет принята с благодарностью

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

Вы можете увидеть фактический запрос, который будет выполняться с помощью метода toSql().

DB::table('general_ledger as g')
        ->join('regions as f','g.from_province','=','f.province')
        ->join('regions as t','g.to_province','=','t.province')
        ->where('g.from_province',$province)
        ->whereBetween('g.created_at',[$from_date,$to_date])
        ->orwhere('g.to_province',$province)
        ->select('g.order_bar','g.price','g.delivery_cost','g.type','f.ar_name as from_province','t.ar_name as to_province','visual_status','g.created_at')
        ->toSql();

Я думаю, вы хотите, чтобы ваш запрос был таким:

SELECT *
FROM `general_ledger`
WHERE created_at BETWEEN '2020-06-01' and '2020-08-01'
AND( from_province = 0 or to_province = 0)

Итак, в Laravel вы можете сгруппировать запрос AND:

DB::table('general_ledger as g')
        ->join('regions as f','g.from_province','=','f.province')
        ->join('regions as t','g.to_province','=','t.province')
        ->whereBetween('g.created_at',[$from_date,$to_date])
        ->where(function(\Illuminate\Database\Query\Builder $q) use ($province){
            $q->where('g.from_province',$province);
            $q->orWhere('g.to_province',$province);
        })
        ->select('g.order_bar','g.price','g.delivery_cost','g.type','f.ar_name as from_province','t.ar_name as to_province','visual_status','g.created_at')
        ->get()
0 голосов
/ 06 августа 2020

Попробуйте этот способ, он отдаст приоритет запросу, который будет выполняться с приоритетом ()

$orders = DB::table('general_ledger as g')
          ->join('regions as f','g.from_province','=','f.province')
          ->join('regions as t','g.to_province','=','t.province')
          ->where(function($query) use ($province) {
               $query->where('g.from_province',$province)->orWhere('g.to_province',$province);
          })
          ->whereBetween('g.created_at',[$from_date,$to_date])
          ->select('g.order_bar','g.price','g.delivery_cost','g.type','f.ar_name as from_province','t.ar_name as to_province','visual_status','g.created_at')
          ->get();
    return response()->json(['status_code'=>2000,'data'=>$orders , 'message'=>''],200);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...