繁体   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