Laravel多对多 - 所有关系的一次进入

时间:2017-09-02 18:14:04

标签: laravel eloquent

我正在寻找解决此问题的有效方法:

我有一个与Prog模型有belongsToMany关系的服务模型。

Service Model: 

public function relatedProgs(){
    return $this->belongsToMany('\App\Prog');
}

在服务表单上,用户可以通过带有$ id => $ name的多选来附加任意数量的Prog。有一个选项可以选择" ALL",它只是通过jquery填写表格中的所有编程。这很愚蠢,因为有数百个Progs。

当然,我不必通过jquery将它们全部添加到表单中 - 我可以在后端添加代码,将它们添加到数据库中...但是我真的很喜欢do只是添加" -1"到DB并没有添加所有数百个模型附加。保持DB较小,然后在关系为-1时,只需将其他页面上的所有内容都插入。

有一种简单/聪明的方法吗?没有id为-1的模型,它将失败,因为prog没有-1 id。我可以创建一个" ALL" Prog模型,但这显然会搞砸其他领域。

1 个答案:

答案 0 :(得分:0)

也许没有一种优雅的方式来做到这一点。也许有人会得到一个更好的答案。现在,我会发布我所做的事情,以防将来有人在寻找答案,虽然对我来说似乎很苛刻。

Multi-select允许用户添加任意​​数量的应用。这将使用relatedProgs-> attach / sync方法直接输入到DB表prog_service中,就像正常一样。

如果用户想要为此服务在数据库(数百个)中添加所有应用程序,他们可以在多选中单击“所有应用程序”。存储/更新方法捕获此-1 id并在prog_service表中输入NO关系,表单jquery也不填充选择框。相反,Laravel方法只是将Service模型上的新bool字段all_progs_related指定为true。

优点:

  • 减少潜在巨大的prog_service表(虽然不是什么大不了的事)
  • 始终在数据库中显示当前应用程序(如果我们通过关系使用硬链接,则不会看到新添加的应用程序)
  • 更好的用户体验:由于数百个应用程序处于丑陋的多选中,表单不会掉到屏幕底部

缺点:

  • Hackish / non-Eloquent(只为所有应用程序的布尔值时无法加载)

  • 触及所有应用程序附加服务的每一段代码都必须牢记逻辑。

IE:

 if($service->all_progs_related)
        $appList = \App\Prog::all();
    else
        $appList = \App\Prog::whereIn('id', $service->relatedProgs->pluck('id')->get();