![](/img/trans.png)
[英]Laravel query with having 'where' and 'orwhere' not working properly
[英]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_province和to_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.