首页 > 解决方案 > Laravel/Eloquent whereIn/where 有一对集合

问题描述

我的数据库中有 3 个表。

前两个表只是具有 ID 和其他一些列的普通表,例如:

表格1

ID col01
1 ...
2 ...

表 2

ID col01
1 ...
2 ...

第三个表是某种关系/分配表:

表3

ID table1_id table2_id 文本
1 1 1 ..
2 1 2 ..
3 1 3 ..
4 2 1 ..
5 3 3 ..

现在我确实有一个 SQL 语句,它完全符合我的要求:

SELECT * FROM table_3 where (table1_id, table2_id) in ( (1, 1), (2, 1), (3, 3));

所以我将以下请求正文发送到 API:

   {
        "assignments": [
            {
                "table1_id": 1,
                "table2_id": 1
            },
            {
                "table1_id": 2,
                "table2_id": 1
            },
            {
                "table1_id": 3,
                "table2_id": 3
            }
        ]
    }

我确实验证了我的请求

->validate($request, 
[         
    'assignments' => 'required|array',
    'assignments.*.table1_id' => 'required|integer|min:1|max:20',
    'assignments.*.table2_id' => 'required|integer|min:1|max:20' 
]

现在我有点坚持如何使用雄辩的命令(例如 whereIn)来获得我想要的输出。

提前致谢!

编辑

所以我采用了这里提到的 arcanedev-maroc 的解决方法:https ://github.com/laravel/ideas/issues/1021

并对其进行编辑以适合我的要求。

奇迹般有效。

标签: laraveleloquent

解决方案


Laravel 默认不提供任何功能。核心团队表示他们不会保留此功能。你可以在这里阅读这篇文章。

但是您可以创建自己的查询来完成此操作。我提供了一个您可以根据您的规范使用的功能:

public function test(Request $request)
{
    $body=$request->input('data');
    $data=json_decode($body)->assignments;
    $query='(table1_id, table2_id) in (';
    $param=array();
    foreach($data as $datum)
    {
        $query=$query."(".$datum->table1_id.",".$datum->table2_id."), ";
    }
    $query = rtrim($query, ", ");
    $query = $query.")";
    $result=DB::table('table3')->whereRaw($query)->get();
    return $result;
}

推荐阅读