Laravel Eloquent正在执行查询作为OR子句而不是AND

时间:2014-07-21 11:27:44

标签: php laravel orm laravel-4 eloquent

我正在尝试使用Eloquent ORM在Laravel 4中构建一个查询,它简单地匹配条件中的所有字段。我有下面的代码,它目前返回的数据符合任何条件,而不是所有条件,如果你愿意,则代替AND。

    $names = Input::get('names');
    $company = Input::get('company');

    $contacts = Contact::where(function($query) use ($names, $tags, $type, $sector, $company)
    {
        if (!empty($names)) {
            $query->where('firstname', 'LIKE', "%{$names}%")
            ->orWhere('lastname', 'LIKE', "%{$names}%");
        }
        if (!empty($company)) {
            $query->where('company', 'LIKE', "%{$company}%");
        }
    })
    ->paginate(100);


    return View::make('index')->with('contacts', $contacts)->with('searchingFlag', $searchingFlag)->with('names', $names)->with('tags', $tags)->with('type', $type)->with('sector', $sector)->with('company', $company);

因此,我认为,我在这里所做的就是声明结果必须与名称字段和公司字段匹配,如果设置了任何一个,但是如上所述返回的结果与任何一个子句匹配而不是两者都匹配。

任何人都可以帮我找出错误吗?

由于

2 个答案:

答案 0 :(得分:1)

你需要筑巢:

if (!empty($names)) {
    $query->where(function ($q) use ($names) {
      $q->where('firstname', 'LIKE', "%{$names}%")
       ->orWhere('lastname', 'LIKE', "%{$names}%");
    }
}

这将导致:

SELECT ... WHERE (firstname like .. OR lasname like ..) AND company ...

答案 1 :(得分:1)

if(!empty($names)) {
    $query->whereRaw('firstname LIKE "%{$names}%" OR lastname LIKE "%{$names}%" ');
    }