使用Laravel Eloquent创建嵌套的OR条件

时间:2016-10-28 17:40:46

标签: laravel laravel-5 eloquent laravel-5.3

我想创建类似的东西:

select * from documents where 'chapter'=3 and 'section'=4 and ('title' like '%abc% OR 'desc' like %abc%);

我怎样才能使用Eloquent?我尝试过使用Eloquent的whereOr方法,但在生成的SQL中似乎没有做任何事情。但是,即使他们这样做了,我也不确定我当前的代码是否会像我正在寻找的那样嵌入它们。

我得到的一些东西:

    $docSearch = DB::table('documents');

    if ($chapter > 0) {
        $docSearch->where('chapter', $chapter);
    }

    $existingManagementArray = Management::getAllManagementIDsAsArray();
    if ($management_id > 0 && in_array($management_id, $existingManagementArray)) {
        $docSearch->where('management_id', $management_id);
    } else {
        $docSearch->whereIn('management_id', $existingManagementArray);
    }

    if (strlen($term) > 0) {
        //HELP! These don't seem to change the SQL
        $docSearch->whereOr('title', 'like', "%$term%"); 
        $docSearch->whereOr('desc', 'like', "%$term%");
    }

    DB::enableQueryLog();
    $allFoundDocs = $docSearch->get();
    dd(DB::getQueryLog());

1 个答案:

答案 0 :(得分:2)

这应该适合你:

DB::table('documents')->where('chapter', 3)
    ->where('section', 4)
    ->where(function($q) use($abc) {
        $q->where('title', 'like', '%'.$abc.'%')
          ->orWhere('desc', 'like', '%'.$abc.'%');
    })->get();

Closure传递给where()方法会指示查询构建器开始一个约束组。Closure将收到一个查询构建器实例,您可以使用它来设置应该的约束包含在括号内。

Docs(称为参数分组的部分)