簡體   English   中英

Laravel 5,左聯接返回聯接右邊的所有項目

[英]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.

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