Laravel 5,左连接返回加入

时间:2016-09-09 18:42:05

标签: mysql laravel left-join

我有3个表:“items”,“faq”和连接表:“item_faq”。 item_faq表保存关系以及一个订单列,以帮助订购每个项目的常见问题。

目前在数据库中总共有5个常见问题。 item_faq表中总共有9行,将这5个常见问题与多个项目相关联。

上下文是管理员可以创建/编辑项目并选择将包含哪些常见问题及其顺序。

在项目管理员创建/编辑视图中,我需要显示所有常见问题,并能够复选框中要包含的内容。

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

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

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

架构:

项目(db中40多行):id,其他字段

常见问题(db中有5个现有行):id,question,answer,other fields

item_faq(db中有9行):item_id,faq_id,order,date fields

物品和常见问题解答都是彼此多在一起的

我想要的回复

5个常见问题,如果项目和常见问题列表中有item_faq列表,则会检查该框。

3 个答案:

答案 0 :(得分:2)

让我看看我是否得到它: 你想要faq与他们的项目(如果它存在),对吗? 如果这是您想要的,您可以使用with方法,如下所示:

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

在你的Faq模型上,你应该与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());
}

在每个项目的刀片中,您可以查看是否来自常见问题解答。像这样:

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

请试试这个。

答案 1 :(得分:1)

似乎多个item_faq行具有相同的faq_id,这就是它将所有项目faq行与item_faq连接的原因。

只有当它具有一对一关系时,您才能获得与faq一样多的行。

如果您希望为每个项目返回最新的常见问题解答,请按faq_id desc和逐项目ID进行排序。返回5行,每个项目包含最新的常见问题

答案 2 :(得分:1)

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