Laravel:正确查询多对多关系

时间:2018-10-15 16:21:54

标签: laravel eloquent

我有2个表和第三个数据透视表,如下所示:

表1:文件

  • id
  • 标题

表2:池

  • id
  • 标题
  • is_visible(1,0)

表3:file_pools

  • file_id
  • pool_id

所有模型和关系均已就绪。

File可能不属于一个,一个或多个池

Pool可能没有文件,1个或更多文件

现在,我想在模型visible中创建范围File,以便:

  • 查询中包含不属于任何一个或1个或更多活动池的任何文件
  • 不应包含任何具有至少1个不可见(is_visible = 0)池的文件,即使该文件属于另一个可见池

下面是我尝试过的内容,但这包括可见池和不可见池中的文件

public function scopeVisible($query)
{
    return $query->doesntHave('pools')->orWhereHas('pools', function ($query) {
        $query->where('is_visible',1);
    });
}

非常欢迎任何帮助

编辑:添加示例数据

table: files

| id       |      title    |  
|----------|---------------|
| 1        |  File A       |
| 2        |  File B       |
| 3        |  File C       |
| 4        |  File D       |

table: pools

| id       |    title      | is_visible|  
|----------|---------------|---------- |
| 1        |  Pool 1       | 1         |
| 2        |  Pool 2       | 0         |

table: file_pools

| file_id  |     pool_id   |  
|----------|---------------|
| 1        |  1            |
| 2        |  2            |
| 3        |  1            |
| 3        |  2            |


The Expected Result : (scope:visible)

| id       |     title     |  
|----------|---------------|
| 1        |  File A       |
| 4        |  File D       |

希望这可以澄清

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的情况:

public function scopeVisible($query)
{
    return $query->whereDoesntHave('pools', function ($query) {
        $query->where('is_visible', 0);
    });
}