使用belongsToMany时如何删除重复的结果

时间:2019-01-25 14:35:05

标签: laravel eloquent relationship has-and-belongs-to-many

具有下表:

-----------    -----------------    ---------------
| 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_idaccesses值,它将在相同的环境中多次读取。

如何强制它只检索一次每个环境?

2 个答案:

答案 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,所以它应该适用于所有当前支持的版本。