我有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列表,则会检查该框。
答案 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();