具有下表:
----------- ----------------- ---------------
| PROJECT | | ACCESSES | | ENVIRONMENT |
----------- ----------------- ---------------
| id | | id | | id |
| title | | project_id | | title |
----------- | environment_id| ---------------
| username |
| password |
-----------------
我的目标是通过访问表获取项目使用的所有环境
在我的项目模型中:
public function environments(){
return $this->belongsToMany('App\Models\Environment', "accesses");
}
我的问题是,如果在project_id
表中有多行具有相同的environment_id
和accesses
值,它将在相同的环境中多次读取。
如何强制它只检索一次每个环境?
答案 0 :(得分:0)
您可以使用同步方法或切换方法来实现,具体取决于您的用例。
从文档中
多对多关系还提供了一种切换方法,可以“切换”给定ID的附件状态。如果当前附加了给定的ID,它将被分离。同样,如果当前已分离,它将被附加:
$project->environments()->toggle([1, 2, 3]);
您还可以使用sync方法构造多对多关联。 sync方法接受一组ID放置在中间表上。给定数组中没有的任何ID将从中间表中删除。因此,完成此操作后,中间表中将仅存在给定数组中的ID
$project->environments()->sync([1, 2, 3]);
有关更多信息,请查看文档。
https://laravel.com/docs/5.6/eloquent-relationships#updating-many-to-many-relationships
答案 1 :(得分:0)
这是一个老问题,但对未来旅行者的好处:
distinct()
方法可以帮助解决这种情况:
public function environments() {
return $this
->belongsToMany('App\Models\Environment', "accesses")
->distinct();
}
来自docs:
<块引用>distinct
方法允许您强制查询返回不同的结果:
$users = DB::table('users')->distinct()->get();
据我所知,这至少可以追溯到 Laravel 4.x,所以它应该适用于所有当前支持的版本。