Laravel查询生成器-在特定列上选择元素唯一或null

Laravel查询生成器-在特定列上选择元素唯一或null,laravel,orm,eloquent,Laravel,Orm,Eloquent,我有一个表格表格的模型Form。有一个名为guid的列,它可以为null,也可以包含某种分组随机散列 我需要选择当前搜索中列guid为空或唯一的所有表单。换句话说,对于在当前搜索中重复guid值,我只选择每个guid哈希的第一次出现 我试过: $results = App\Form::where(... some where clauses .. ).groupBy('guid') 这几乎可以,但对于所有行,其中guid==NULL将它们分组并只选择一个(我需要所有行) 如何通过构建适当的SQ

我有一个表格表格的模型
Form
。有一个名为
guid
的列,它可以为null,也可以包含某种分组随机散列

我需要选择当前搜索中列
guid
为空或唯一的所有表单。换句话说,对于在当前搜索中重复
guid
值,我只选择每个guid哈希的第一次出现

我试过:

$results = App\Form::where(... some where clauses .. ).groupBy('guid')
这几乎可以,但对于所有行,其中
guid==NULL
将它们分组并只选择一个(我需要所有行)

如何通过构建适当的SQL查询或在PHP中过滤结果来获取唯一行或空行

注意:我需要我的
$results
成为
illumb\Database\elount\Builder
实例

编辑:

我发现我需要的查询的SQL版本是:

SELECT * FROM `forms` WHERE .... GROUP BY IFNULL(guid, id)

对于Laravel的数据库查询生成器,什么是等效查询

更新:使用
DB::raw

App\Form::where(... conditions ...)
        ->groupBy(DB::raw("IFNULL('guid', 'id')"));
或者另一种方式可以是:

您还可以使用以下命令合并两个集合(&A):

首先获取
guid
按分组的结果(此处不包括null guid):

现在,获取
guid
null
的结果:

$all_guid_with_null = App\Form::whereNull('guid')->get();
最后,使用
merge()
方法合并两个集合:

$filtered_collection = $unique_guid_without_null->merge($all_guid_with_null);

希望这有帮助

对于您编辑的问题,您可以使用as

因此,您的最终查询将如下所示:

$results = App\Form::where(... some where clauses .. )
                   ->groupBy(DB::raw("IFNULL('guid', 'id')"));

通过上面的查询,您的
$results
将成为
illumb\Database\elount\Builder

的一个实例,我不能使用
get()
merge()
-我需要
$result
作为查询生成器
Builder
实例,但您已经提到了-通过使用查询或使用php,所以
get()
merge()
都是php方法@Gacek-为什么你删除了我接受的答案?我已按你的要求正确地回答了!因为您在最后使用了
get()
,因此它不再是
Builder
instance@Gacek-所以你也可以说另一个人没有提到我提到的其他东西:(这不公平,随它去吧,不要打架,这个世界没有那么忠诚的人!是的,就是这样。它仍然是
Builder
实例-这就是我要找的!谢谢
->groupBy(DB::raw("IFNULL('guid', 'id')"))
$results = App\Form::where(... some where clauses .. )
                   ->groupBy(DB::raw("IFNULL('guid', 'id')"));