Laravel查询构建器 - 选择唯一的元素或在特定列上为null

时间:2016-12-15 16:43:32

标签: laravel orm eloquent

我有一个用于表格的模型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的数据库查询构建器有什么等效查询?

2 个答案:

答案 0 :(得分:3)

更新:使用DB::raw

App\Form::where(... conditions ...)
        ->groupBy(DB::raw("IFNULL('guid', 'id')"));

或者另一种方式可能是:

您还可以使用whereNotNullwhereNull&最后使用merge()合并这两个集合,如下所示:

首先得到guid分组的结果(不包括null guid):

$unique_guid_without_null = App\Form::whereNotNull('guid')->groupBy('guid')->get();

现在,获取guidnull的结果:

$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的实例。