簡體   English   中英

Laravel 或Where 查詢無法正常工作

[英]Laravel orWhere query is not working properly

我有以下查詢,它工作正常並獲得所需的結果

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

我需要 select 行,其中列from_provinceto_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匹配參數時的行

這里有什么問題?

任何幫助都感激不盡

您可以看到將要使用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()

試試這種方式,它將優先執行將在優先級()執行的查詢

$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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM