2016-10-28 271 views
1

我想创造一些像创建嵌套OR条件:使用Laravel雄辩

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

我怎样才能做到这一点使用雄辩?我尝试过使用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()); 

回答

0

这应该为你工作:

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

传递一个Closurewhere()方法指示查询生成器,开始约束group.The Closure将收到一个查询构建器实例,您可以使用该实例设置应该包含在括号组中的约束。

Docs(部分称为参数分组)

+0

这很好。你能描述一下怎么回事?我没有看到在Eloquent文档中传递函数。 – zundi

+0

@ zundi,你可以将closure(function)传递给'where()'方法并向父'where()'添加高级约束。你可以做多层嵌套的'where()'。如果你想传递一些数据给闭包,不要忘记使用'use()'。 –

+1

学到了新的东西,谢谢阿列克谢 – zundi