iT邦幫忙

0

Laravel LEFTOUTERJOIN 如何編寫Eloquent ORM

YJ 2020-09-28 12:35:041590 瀏覽

最近查詢建立報表需加入LEFTOUTERJOIN ,網上爬文許久未找到相關資料,只好上來這請求各位大神們的引導協助/images/emoticon/emoticon02.gif

skyksl066 iT邦新手 5 級 ‧ 2020-09-28 13:14:32 檢舉
Laravel 沒提供outerjoin
只能用leftjoin 或rightjoin
你也可以用DB:raw去join
skyksl066 iT邦新手 5 級 ‧ 2020-09-28 13:39:44 檢舉
你可以提供你的ORM 跟model 還有要join的表單上來看看

2 個回答

2
小魚
iT邦大師 1 級 ‧ 2020-09-28 13:02:54

可以參考 How to join three table by laravel eloquent model

我也試過

ORM -> join('survey', 'survey.id', '=', 'survey_record.survey_id')
    -> orderBy('survey.notification_time', 'desc')

這種方式,
有些特殊的語法需要自己嘗試,
不過方向大概是這樣...
今年鐵人賽剛好也在寫Laravel.

YJ iT邦新手 5 級 ‧ 2020-09-28 14:42:14 檢舉

小魚大神的各處的解答及文章我絕對看,可以帶給我新的思維及觀念,超讚的/images/emoticon/emoticon07.gif

目前問題卡在我用leftjoin帶出表的值,但leftjoin濾掉了第一表的值,但報表要帶出第一表的資料。/images/emoticon/emoticon02.gif

1
skyksl066
iT邦新手 5 級 ‧ 2020-09-28 13:52:27

try this

join('orders', 'users.id', '=', 'orders.user_id','left outer')
看更多先前的回應...收起先前的回應...
YJ iT邦新手 5 級 ‧ 2020-09-28 14:43:15 檢舉

嘗試過了,這個方法不行喔/images/emoticon/emoticon02.gif

YJ iT邦新手 5 級 ‧ 2020-09-28 16:36:23 檢舉

目前Controller Code

$a=totalModel::select(

  'total.area',
  'total.vendor',
  'total.barcode',
  'total.name',
  'total.unit',
  'total.stock',
  warehouseModel::raw("sum(warehouse2.num) as d"),
  warehouseModel::raw("sum(warehouse2.outnum) as e"),
  totalModel::raw("sum(total.stock) as r"),
  )
->leftJoin('warehouse2',function ($join) {
$join->on('total.id', '=', 'warehouse2.total_id');})
->orwhere(function($c){
$c->wherebetween('total.area',[20, 50])
->wherebetween('warehouse2.ship_at',['2020-08-01','2020-08-31']);
})
->orwhere(function($query){
$query->wherebetween('total.area',[20, 50])
->wherebetween('warehouse2.purchase_at',['2020-08-01','2020-08-31']);
})
->groupBy(
'total.name',
'total.area',
'total.barcode',
'total.vendor',
'total.unit',
'total.stock'
)
->orderby('area','asc')
->get();
skyksl066 iT邦新手 5 級 ‧ 2020-09-28 16:44:14 檢舉

你要不要考慮,先拿掉其他部分只留join確定看看totalModel表的資料有沒有保留下來,正常left join totalModel表的資料都會被留下的

YJ iT邦新手 5 級 ‧ 2020-09-28 16:59:22 檢舉

也會濾掉喔,目前設計是total表是所有商品的資訊,warehouse2是進出貨單建立的資訊表,報表想抓出total.area(是商品的擺放位置)20~50,但目前用join warehouse2表會把只有warehouse2的資料抓出,total.area20~50沒有在warehouse2不會出現/images/emoticon/emoticon02.gif

skyksl066 iT邦新手 5 級 ‧ 2020-09-28 17:03:41 檢舉

不會啊,我剛剛用laravel 7試了一下
A表的資料都有留下來
Join進來的B表欄位會有Null

YJ iT邦新手 5 級 ‧ 2020-09-28 17:10:22 檢舉

那可以請教一下view那裏您怎麼寫的嗎/images/emoticon/emoticon25.gif

skyksl066 iT邦新手 5 級 ‧ 2020-09-28 17:20:14 檢舉

你先toSql()拿去sql那邊查一下出來的結果是不是你要的再來看view吧

skyksl066 iT邦新手 5 級 ‧ 2020-09-28 17:30:05 檢舉

或者可以把確定可以用的sql語法丟上來看看,看看是不是改寫ORM有改錯

YJ iT邦新手 5 級 ‧ 2020-09-28 17:30:22 檢舉

我join這邊改成
->join('warehouse2', 'total.id', '=','warehouse2.total_id','left outer')
結果還是一樣warehouse無建進出貨資料的,total.area還是無法顯示

YJ iT邦新手 5 級 ‧ 2020-09-28 17:49:33 檢舉

改了一個sql,會濾掉total.area20~50 ,warehouse無建過資料的

select total.id, total.stock, total.area, sum(warehouse2.num), sum(warehouse2.outnum),
warehouse2.expiration_at,
warehouse2.ship_at
from total
left outer join warehouse2
ON total.id = warehouse2.total_id
where (total.area between 20 and 50)
and (month(warehouse2.purchase_at) = 8 or month(warehouse2.ship_at) = 8)
group by total.id
skyksl066 iT邦新手 5 級 ‧ 2020-09-28 17:52:44 檢舉

所以這個在sql裡面查出來是你要的結果嗎?
我看你原本的ORM裡面一堆groupby 這邊就一個

YJ iT邦新手 5 級 ‧ 2020-09-28 17:58:47 檢舉

不是喔,Laravel orm select值 groupby要給

skyksl066 iT邦新手 5 級 ‧ 2020-09-28 18:23:39 檢舉

我不知道你要什麼所以幫你把你那串SQL改成ORM

$temp = totalModel::selectRaw('total.id, total.stock, total.area, sum(warehouse2.num), sum(warehouse2.outnum), warehouse2.expiration_at, warehouse2.ship_at')
    ->Join('warehouse2' , 'total.id', '=', 'warehouse2.total_id', 'left outer')
    ->where(function ($q){
        $q->wherebetween('total.area', array(20,50));
    })
    ->where(function ($q){
        $q->whereRaw('month(warehouse2.purchase_at) = 8 or month(warehouse2.ship_at) = 8');
    })
    ->groupby('total.id')
    ->get();
YJ iT邦新手 5 級 ‧ 2020-09-29 08:38:35 檢舉

謝囉,目前找到會濾掉的原因在where的地方但現在卡住要如何再把total.area20~50全列表

skyksl066 iT邦新手 5 級 ‧ 2020-09-29 10:39:48 檢舉

???不知道你要什麼啊...
你可以把sql丟上來我幫你改寫你在研究有什麼差別吧...

YJ iT邦新手 5 級 ‧ 2020-10-02 10:43:29 檢舉

感謝您,我整理一下資料再重新發問喔,謝謝

我要發表回答

立即登入回答