有没有一个干净的方法来做一个有说服力的复合状态。
查询结果将是:
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/