2016-10-28 275 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