Laravel多对多-所有关系的一个条目

Laravel多对多-所有关系的一个条目,laravel,eloquent,Laravel,Eloquent,我正在寻找一种有效的方法来解决这个问题: 我有一个服务模型,它与Prog模型有着密切的关系 Service Model: public function relatedProgs(){ return $this->belongsToMany('\App\Prog'); } 在服务表单上,用户可以通过$id=>$name的多选来附加任意多个程序。有一个选择“ALL”的选项,它只是通过jquery用列表中的所有程序填充表单。这很愚蠢,因为有数百个程序 当然,我不必通过jquery

我正在寻找一种有效的方法来解决这个问题:

我有一个服务模型,它与Prog模型有着密切的关系

Service Model: 

public function relatedProgs(){
    return $this->belongsToMany('\App\Prog');
}
在服务表单上,用户可以通过$id=>$name的多选来附加任意多个程序。有一个选择“ALL”的选项,它只是通过jquery用列表中的所有程序填充表单。这很愚蠢,因为有数百个程序

当然,我不必通过jquery将它们全部添加到表单中-我可以在后端使用代码将它们添加到数据库中。。。但我真正想做的是在DB中添加“-1”,而不是添加所有数百个附加的模型。保持数据库小,然后当关系为-1时,只需删除其他页面上的所有内容


有没有一种简单/聪明的方法可以做到这一点?如果id-1处没有模型,它将失败,因为程序没有-1 id。我可以创建一个“所有”的Prog模型,但这显然会把其他方面搞砸。

也许没有一种优雅的方法来做到这一点。也许有人会给你一个更好的答案。现在,我将公布我所做的事情,以防将来有人在寻找答案,尽管这对我来说似乎有点骇人听闻

Multi-select允许用户添加任意数量的应用程序。这将使用relatedProgs->attach/sync方法(如普通方法)直接输入数据库表prog_服务

如果用户想要为该服务添加数据库中的所有应用程序(数百个),他们可以单击多选菜单中的“所有应用程序”。存储/更新方法捕获这个-1 id,并且在prog_服务表中不输入任何关系,表单jquery也不填充选择框。相反,Laravel方法只是简单地分配一个新的bool字段,服务模型上所有相关的progs都为true

优点:

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

  • Hackish/无说服力(当所有应用程序都是布尔值时,无法立即加载)

  • 每一段涉及到一项服务的代码,包括所有“附加”的应用程序,都必须牢记逻辑

即:


也许没有一个优雅的方式来做到这一点。也许有人会给你一个更好的答案。现在,我将公布我所做的事情,以防将来有人在寻找答案,尽管这对我来说似乎有点骇人听闻

Multi-select允许用户添加任意数量的应用程序。这将使用relatedProgs->attach/sync方法(如普通方法)直接输入数据库表prog_服务

如果用户想要为该服务添加数据库中的所有应用程序(数百个),他们可以单击多选菜单中的“所有应用程序”。存储/更新方法捕获这个-1 id,并且在prog_服务表中不输入任何关系,表单jquery也不填充选择框。相反,Laravel方法只是简单地分配一个新的bool字段,服务模型上所有相关的progs都为true

优点:

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

  • Hackish/无说服力(当所有应用程序都是布尔值时,无法立即加载)

  • 每一段涉及到一项服务的代码,包括所有“附加”的应用程序,都必须牢记逻辑

即:

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