Laravel 5,左侧连接 returns 连接右侧的所有项目

Laravel 5, left join returns all items from right side of join

我有 3 个 tables:"items"、"faq" 和一个连接 table:"item_faq"。 item_faq table 保存关系以及一个订单列以帮助订购每件商品的常见问题解答。

目前数据库中共有5个常见问题。 item_faq table 中共有 9 行将这 5 个常见问题解答与多个项目相关联。

上下文是管理员可以 create/edit 一个项目和 select 将包含哪些常见问题及其顺序。

在项目管理员 create/edit 视图中,我需要显示所有常见问题解答并能够选中我想要包括的内容。

在我的控制器中,我正在做这样的左连接:

$faqs = \App\Faq::leftJoin('item_faq', 'faq.id', '=', 'item_faq.faq_id')->get();

我是 dd($faqs) 来测试 returned 的内容,我得到了 9 个对象。这就是我的问题所在:我需要它来 return 5 个常见问题解答,如果有 item_faq 与此项目和常见问题解答相关,则选中常见问题解答复选框。

架构:

项目(数据库中超过 40 行):id,其他字段

Faq(数据库中已有5行):id、question、answer、其他字段

item_faq(数据库中的 9 行):item_id、faq_id、订单、日期字段

Item 和 FAQ 都在 many_to_many 中

我要找回什么

5 个常见问题解答,如果有一个 item_faq 项目列表和常见问题解答,它将选中该框。

似乎多个 item_faq 行具有相同的 faq_id,这就是为什么它用 item_faq.

连接所有项目常见问题解答行

只有当它是一对一的关系时,你才能得到与 faq 一样多的行数。

如果您希望为每个项目返回最新的常见问题解答,请按 faq_id desc 排序并按项目 ID 分组。 returns 5 行每个项目的最新常见问题解答

让我看看我是否明白了: 您想要带有他们项目的常见问题解答(如果存在),对吗? 如果那是你想要的,你可以像这样使用 with 方法:

$faqs = \App\Faq::with('items')->get();

在您的 Faq 模型上,您应该与项目有关系

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());
}

在每个项目的 blade 中,您检查它是否来自常见问题解答。像这样:

<input type="checkbox" name="items[]" id="{{ $item-id }}" {{ $faq->hasItem($item-id) ? 'checked' : '' }}>

请试试这个。

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();