有没有一个干净的方法来做一个有说服力的复合状态。
查询结果将是:

SELECT * FROM `table` WHERE (relation_type, relation_id) IN (('App\\Model', 1),('App\\Model', 3))

如您所见,这将有助于对一个具有与其他5个模型链接的多态关系的实体进行单个查询获取。
我目前的解决方案是纯的:
//Example :array of array with Model name & id
$couples = [
    ['relation_type' => 'App\\Model', 'relation_id' => 1],
    ['relation_type' => 'App\\ModelTwo', 'relation_id' => 2],
    ['relation_type' => 'App\\ModelThree', 'relation_id' => 5],
    ['relation_type' => 'App\\ModelTwo', 'relation_id' => 20],
    //...
    ['relation_type' => 'App\\Model', 'relation_id' => 999],
];
$query = "SELECT * FROM table WHERE ('relation_type', 'relation_id') IN (("
        .implode('),(', array_map(function ($entry) {
            return "'".$entry['relation_type']."',".$entry['relation_id']; //I know , in relation_type the '\' needs to be escaped.
        }, $couples))
        ."))";
$results = \DB::select($query);
}

最佳答案

首先,您可以在列和值中都输入DB::raw,这将解决SQL查询正确性的问题,我在MySql 5.7上测试了下面的代码,它工作正常。raw只是将原始字符串添加到查询中,使用注入会很危险。

->whereIn(DB::raw('(relation_type, relation_id)'), [DB::raw("('App\\Model', '2')")])

现在我们只需要将数组转换成那个结构,我的方法是数组映射foreach也可以做到这一点。
$couples = array_map(function ($item) {
    $type = $item['relation_type'];
    $id = $item['relation_id'];

    return DB::raw("('$type', '$id')");
}, $couples);

然后用一个简单的Laravel查询调用它,您应该可以很好地开始。
$models = Model::whereIn(DB::raw('(relation_type, relation_id)'), $couples)->get()

关于php - Eloquent :综合条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57789986/

10-10 16:51