场景描述
需要根据商品分类、商品名称和条形码这三个查询条件去取出结果集,这三者的关系是:商品分类 and (商品名称 or 条形码)
错误尝试
第一次写出来的代码是这样的:
$goodsModel = $goodsModel->where('name', 'like', "%{$keyword}%")->orWhere('barcode', 'like', "%{$keyword}%");
然后会发现这样的写法会导致三者的关系变成了:商品分类 and 商品名称 or 条形码。
建议使用 where 的闭包方式
这种方式将 or 部分写成 closure 传入 where()
,与 Eloquent 风格一致,可读性较好。代码如下:
DB::table('users') ->where('name', '=', 'John') ->where(function ($query)use ($votes)
{ $query->where('votes', '>', $votes
) ->orWhere('title', '<>', 'Admin'); }) ->get();
原生
实在想不出怎么写,就写原生 SQL 好了。这也是最后一种保险但不提倡的做法了吧,代码如下:
$goodsModel = $goodsModel->whereRaw('(name like ? or barcode like ?)', [$keyword, $keyword]);