使用(whereIn)搜索时如何获取(未找到)结果

时间:2019-02-12 13:14:11

标签: laravel eloquent

我在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

步骤数较少,有没有办法仅通过建立查询来获取这样的结果?

1 个答案:

答案 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数组最后将包含您想要的结果。