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