【发布时间】:2019-08-26 19:18:27
【问题描述】:
我已经多次将查询对象传递给子函数,没有任何问题。但是,当我想要 OR 关系时,查询生成器非常强迫症,总是给我 AND!
业务逻辑:site_id = $site_id AND (cond1 OR cond2 OR ..) cond1..n 取自$cols 任意匹配$search。
$cols = "priority, status, name, actionType"
$search 是要搜索的字符串,在这种情况下:Medium
这里的问题是不是缺少的列,这是为了创建错误以吐出 SQL。如何让 Laravel 使用 orWhere 和括号正常运行的问题。
第一种方法:
$data = $this->where('site_id', $site_id) ;
$data = $this->search($cols, $orderBy, $search, $data) ;
第二种方法(搜索(...)):
$searches = explode(',', $col);
$len = sizeof($searches) ;
if ($len > 0) {
for ($i=0; $i < $len ; $i++) {
$val = trim($searches[$i]) ;
$data->where(function ($query) use ($val, $search, $data) {
$query->orWhere(function ($query1) use ($val, $search, $data) {
$query1->orWhereRaw("$val LIKE '%$search%'");
}) ;
}) ;
} // for
} // if
我特意留下一个未知的列来查看 Laravel 生成的 SQL:
Unknown column 'name' in 'where clause' (SQL: select count(*) as aggregate from `actions` where `site_id` = 555 and ((priority LIKE '%Medium%')) and ((status LIKE '%Medium%')) and ((name LIKE '%Medium%')) and ((actionType LIKE '%Medium%')))
如您所见,尽管有多个 orWhere's I 仍然得到 AND!因为第二种方法在基础模型中,它是为所有查询而设计的,我试图避免过多的重复搜索功能。
SQL 几乎就是我想要的。
如果我省略以下代码:
// $data->where(function ($query) use ($val, $search, $data) {
$data->orWhere(function ($query1) use ($val, $search, $data) {
$query1->orWhereRaw("$val LIKE '%$search%'");
}) ;
// }) ;
结果为:
Unknown column 'name' in 'where clause' (SQL: select count(*) as aggregate from `actions` where `site_id` = 555 or (priority LIKE '%Medium%') or (status LIKE '%Medium%') or (name LIKE '%Medium%') or (actionType LIKE '%Medium%')
【问题讨论】:
标签: php laravel laravel-5 eloquent