我有一个用于表格的模型Form
。有一个名为guid
的列可以为null,或者包含某种分组随机散列。
我需要在当前搜索中选择列guid
为null或唯一的所有表单。换句话说,为了在当前搜索中重复guid
值,我只选择每个guid哈希的第一次出现。
我试过了:
$results = App\Form::where(... some where clauses .. ).groupBy('guid')
它几乎没问题,但对于所有行,guid == NULL
它将它们分组并只选择一个(我需要所有这些行)。
如何通过构建正确的SQL查询或在PHP中过滤结果来获取唯一行或空行?
注意:我需要$results
成为Illuminate\Database\Eloquent\Builder
个实例
修改
我认为我需要的SQL版本的查询是:
SELECT * FROM `forms` WHERE .... GROUP BY IFNULL(guid, id)
Laravel的数据库查询构建器有什么等效查询?
答案 0 :(得分:3)
更新:使用DB::raw
App\Form::where(... conditions ...)
->groupBy(DB::raw("IFNULL('guid', 'id')"));
或者另一种方式可能是:
您还可以使用whereNotNull
,whereNull
&最后使用merge()
合并这两个集合,如下所示:
首先得到guid
分组的结果(不包括null guid):
$unique_guid_without_null = App\Form::whereNotNull('guid')->groupBy('guid')->get();
现在,获取guid
为null
的结果:
$all_guid_with_null = App\Form::whereNull('guid')->get();
最后使用merge()
方法合并两个集合:
$filtered_collection = $unique_guid_without_null->merge($all_guid_with_null);
希望这有帮助!
答案 1 :(得分:1)
对于您编辑过的问题,您可以使用raw()
作为;
->groupBy(DB::raw("IFNULL('guid', 'id')"))
所以你的最终查询将是:
$results = App\Form::where(... some where clauses .. )
->groupBy(DB::raw("IFNULL('guid', 'id')"));
通过上述查询,您的$results
将成为Illuminate\Database\Eloquent\Builder
的实例。