[英]Laravel 5, left join returns all items from right side of join
我有3個表:“ items”,“ faq”和一個聯接表:“ item_faq”。 item_faq表包含關系以及訂單列,以幫助訂購每個項目的常見問題解答。
當前,數據庫中共有5個常見問題解答。 item_faq表中共有9行,將這5個常見問題與多個項目相關聯。
上下文是管理員可以創建/編輯項目並選擇要包含的常見問題及其順序。
在項目admin創建/編輯視圖上,我需要顯示所有常見問題解答,並能夠選中我要包括的常見問題解答。
在我的控制器中,我正在像這樣進行左聯接:
$faqs = \App\Faq::leftJoin('item_faq', 'faq.id', '=', 'item_faq.faq_id')->get();
我是dd($ faqs)來測試返回的內容,並且得到9個對象。 這是我的問題所在:我需要它返回5個常見問題,如果有與此項目和常見問題相關的item_faq,則選中“常見問題”復選框。
架構:
項目(db中40余行):id,其他字段
常見問題(db中有5個現有行):id,問題,答案,其他字段
item_faq(數據庫中有9行):item_id,faq_id,訂單,日期字段
Item和FAQ彼此之間在many_to_many中
我想找回什么
5個常見問題,如果該項目和常見問題有一個item_faq列表,它將選中該框。
讓我看看我是否明白:您想要含有他們物品的常見問題解答(如果存在),對嗎? 如果這是您想要的,則可以使用with
方法,如下所示:
$faqs = \App\Faq::with('items')->get();
在常見問題解答模型上,您應該與Item有關系
public method Items() {
return $this->hasMany(Item::class);
}
現在,您可以通過
foreach($faqs as $faq) {
var_dump($faq->items);
}
編輯:
我認為您需要創建一個函數來檢查每個復選框,並查看是否應該像這樣進行檢查:在您的Faq模型中創建以下方法:
public function hasItem($item) {
return in_array($item, $this->items()->toArray());
}
在每個項目的刀片中,檢查是否來自FAQ。 像這樣:
<input type="checkbox" name="items[]" id="{{ $item-id }}" {{ $faq->hasItem($item-id) ? 'checked' : '' }}>
請嘗試一下。
似乎多個item_faq行具有相同的faq_id,這就是為什么它將所有item常見問題行與item_faq連接在一起的原因。
只有具有一對一的關系,您才能獲得與常見問題一樣多的行。
如果要為每個項目返回最新的常見問題解答,請按faq_id desc進行排序,並按項目id進行分組。 返回5行,每個項目的最新常見問題解答
DB::table('faq')
->leftjoin('item_faq','faq.id','=','item_faq.faq_id')
->leftjoin('item','item_faq.item','=','item.id')
->select('faq.*','item.id as iId')->get();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.