laravel 写多个where子句来过滤文件

laravel write multiple where clause to filter files

我不知道如何使用 eloquent 在我的 laravel 9 应用程序中过滤它。

我有一个文件 table 和 file_metadata (pivot) - 其中文件有多个元数据:

例如:file_metadata 3 个文件:

metadata_id|file_id|value
 3         | 5     | 1
 6         | 5     | 1
 3         | 6     | 1
 6         | 6     | 1
 3         | 7     | 1
 6         | 7     | 0

因此文件 5、6、7 有 2 个元数据(3 个有效,6 个已签名)。文件 7 处于活动状态但未签名。

如何编写 where 子句以在这种情况下显示已签名且处于活动状态的两个文件 (5,6)?

我已经试过了,但还显示了 ID 为 7 的文件(未签名)

->where(function($query) {
   $query->orWhere('file_metadata.metadata_id', 3);
   $query->orWhere('file_metadata.metadata_id', 6)
   $query->where('file_metadata.value', true);
})

我也试过这个:

->where(function($query) {
   $query->Where([
     ['file_metadata.metadata_id', 3],
     ['file_metadata.value', true']
   ]);
   $query->where([
     ['file_metadata.metadata_id', 6],
     ['file_metadata.value', true']
   ]);
}

知道如何设置条件来获取已签名且有效的文件吗?

calin24 试试这个

->where(function($query) {
   $query->orWhere('file_metadata.metadata_id', 3);
   $query->orWhere('file_metadata.metadata_id', 6);
})->where('file_metadata.value', true)

你可以像下面这样使用子查询

->where('file_metadata.metadata_id', 6)
->where('file_metadata.value', 1);
->whereIn('file_metadata.file_id', function($query) {
    $query->select('file_id')->from('file_metadata')
        ->where('metadata_id', 3)->where('value', 1);
})

试试这个:

->where(function($query) {
    $query->where('file_metadata.metadata_id', 3)->where('file_metadata.value', true);
    $query->where('file_metadata.metadata_id', 6)->where('file_metadata.value', true);
})

最后的 where 子句是这样的:

->where(function ($query) use ($metas_ids) {
         $query->whereIn('file_metadata.file_id', function($query) use ($metas_ids) {
            $query->select('file_id')
                ->from('file_metadata')
                ->whereIn('metadata_id', $metas_ids)
                ->where('value', true)
                ->groupBy('file_id')
                ->havingRaw('count(file_id) = ?', [count($metas_ids)]) 
        });
    })