我有三个表:"items“、"faq”和一个连接表:"item_faq“。item_faq表保存关系以及一个订单列,以帮助每个项目订购常见问题。
目前数据库中共有5个常见问题。item_faq表中共有9行将这5个常见问题与多个项相关联。
上下文是管理员可以创建/编辑一个项目,并选择将包含哪些常见问题,以及它们的顺序。
在item admin create/edit视图上,我需要显示所有常见问题,并且能够选中我想要包含的那些faqs。
在我的控制器中,我正在做这样的左连接:
$faqs = \App\Faq::leftJoin('item_faq', 'faq.id', '=', 'item_faq.faq_id')->get();
我是dd($faqs)来测试返回的内容,我得到了9个对象。这就是我的问题所在:我需要它返回5个常见问题,如果有一个与此项目和常见问题相关的item_faq,那么会选中faq复选框。
模式:
项目(db中的40+行):id,其他字段
常见问题(数据库中有5行):id、问题、答案、其他字段
item_faq (db中的9行):item_id、faq_id、order、date字段
项目和常见问题都在一个many_to_many中,并且彼此相联。
我想要回来的东西,
5常见问题,如果有项目和常见问题的item_faq列表,它将选中该框。
发布于 2016-09-16 17:26:38
让我看看我是否明白:你想要faq和他们的物品(如果它存在),对吗?如果这是您想要的,您可以使用这样的with
方法:
$faqs = \App\Faq::with('items')->get();
在你的常见问题模型中,你应该与项目有关系。
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' : '' }}>
请试试这个。
发布于 2016-09-16 00:56:48
多个item_faq行似乎具有相同的faq_id,这就是它将所有项目faq行与item_faq连接的原因。
只有当它有一对一的关系时,你才能得到和faq一样多的行。
如果您希望为每一项返回最新的常见问题解答,请按faq_id desc命令并按项目id分组。返回每项包含最新常见问题的5行
发布于 2016-09-17 02:49:25
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();
https://stackoverflow.com/questions/39417895
复制相似问题