我在Laravel Project DB方案中得到了这个表:
id | user_id | reference | created_at --------------------------------------- 1 | 2 | ref - 1 | dd/mm/yy 2 | 2 | ref - 2 | dd/mm/yy 3 | 2 | ref - 3 | dd/mm/yy 4 | 2 | ref - 4 | dd/mm/yy
现在,我想构建一个查询以传递引用数组,然后获取返回的结果作为对我传递的数组中每个元素的返回,例如:
id | user_id | reference | created_at -------------------------------------- 3 | 2 | ref - 3 | dd/mm/yy 4 | 2 | ref - 4 | dd/mm/yy null| null | ref - 5 | null
未找到 ref-5 的地方
更新: 现在这是我的代码:
$references = ['ref - 3','ref - 4','ref - 5'];
$result = Reference::whereIn('reference',$references)->get();
结果将忽略 ref-5 ,因为未找到。 所以我得到的像是:
id | user_id | reference | created_at -------------------------------------- 3 | 2 | ref - 3 | dd/mm/yy 4 | 2 | ref - 4 | dd/mm/yy
我想为未找到的引用保留一行,因此结果如下所示:
id | user_id | reference | created_at -------------------------------------- 3 | 2 | ref - 3 | dd/mm/yy 4 | 2 | ref - 4 | dd/mm/yy null| null | ref - 5 | null
步骤数较少,有没有办法仅通过建立查询来获取这样的结果?
答案 0 :(得分:1)
我建议您使用PHP实现此目的。它将也是可读的。
<?php
$references = ['ref - 3','ref - 4','ref - 5'];
$result = Reference::whereIn('reference',$references)->get()->toArray();
$obtained_refs = [];
foreach($result as $each_record){
$obtained_refs[$each_record['reference']] = true;
}
foreach($references as $each_ref){
if(!isset($obtained_refs[$each_ref])){
// if reference is not present, add it to result array
$result[] = [
'id' => NULL,
'user_id' => NULL,
'reference' => $each_ref,
'created_at' => NULL
];
}
}
算法:
$result
中(就像您已经做过的那样)。$obtained_refs
,它将每个引用作为键,从而跟踪您在结果集中获得的所有引用。这样做是为了使查找更快。 $references
数组,并检查在我们的$obtained_refs
中是否没有引用。如果是,则将其添加到$result
数组中,否则不执行任何操作。 $result
数组最后将包含您想要的结果。