2014-05-01 118 views
1

請幫我做這個查詢的口才。一個企業可以有很多種類。Laravel Eloquent多對多查詢

SELECT b.* 
FROM businesses b 
     INNER JOIN categorybusiness cb 
       ON b.id = cb.business_id 
     INNER JOIN category c 
       ON cb.category_id = c.id 
WHERE b.location LIKE '%query1%' 
     AND b.location LIKE '%query2%' 
     AND c.name LIKE '%query3%' 
     AND c.name LIKE '%query4%' 

我的表是..業務 - 包括位置列和類別和業務數據透視表..

UPDATE: 所以我用這個查詢...

$business5 = Business::WhereHas('categories', function($q) use($category,$query1) 
    { 
      $q->whereRaw("name like '%$category%' or businesses.name like '%$category%' $query1");   
    })->get(); 

$ query1看起來像這樣,但是在一個循環中。

 $query1 .= " and businesses.address1 like '%$string%'"; 

這工作正常,但有人可以幫助我做出一個「匹配反對」聲明的口才從此。

+0

你試過了什麼?你可以粘貼它嗎? –

回答

3

用於製造Eloquent查詢你需要設置的關係,創造many-to-many關係,你需要建立這樣的關係,這兩種模式:

Business模型:

class Business extends Eloquent { 
    //... 
    public function categories() 
    { 
     return $this->belongsToMany('Caregory'); 
    } 
} 

Category模型:

class Category extends Eloquent { 
    //... 
    public function businesses() 
    { 
     return $this->belongsToMany('Business'); 
    } 
} 

The Eloquent查詢(你已經有一個pivot表):

$businesses = Business::with(array('categories' => function($q) use ($query3, $query4) { 
    $q->where('categories.name', 'LIKE', '%'. $query3 .'%') 
     ->where('categories.name', 'LIKE', '%'. $query4 .'%'); 
}))->where('businesses.location', 'like', '%'. $query1 .'%') 
    ->where('businesses.location', 'like', '%'. $query2 .'%') 
    ->get(); 

要檢查的結果只是用dd($businesses);並檢查收集所以你會得到關於他們如何可以循環在你的view的想法。基本上,$businesses將包含一個集合,集合將包含$categories另一個集合中的每個$business模式,使循環可以是這樣的:

@foreach($businesses as $business) 
    {{ $business->propertyname }} 
    @foreach($business->categories as $category) 
     {{ $category->propertyname }} 
    @endforeach 
@endforeach 
1

假設你有Business MOEL設置,這正是你想要的查詢通過@WereWolf建議作爲預先加載不會在這裏做的工作(其中的連接表的條款VS上2個獨立的查詢):

Business::from('businesses as b') 
    ->join('categorybusiness as cb', 'b.id', '=', 'cb.business_id') 
    ->join('category as c', 'c.id', '=', 'cb.category_id') 
    ->where('b.location', 'like', "%$query1%") 
    ->where('b.location', 'like', "%$query2%") 
    ->where('c.name', 'like', "%$query3%") 
    ->where('c.name', 'like', "%$query4%") 
    ->get(['b.*']); 

也有使用另一種方式方法只要你有belongsToMany關係正確設置

Business::whereHas('categories', function ($q) use ($query3, $query4) { 
    $q->where('categories.name', 'like', "%$query3%") 
     ->where('categories.name', 'like', "%$query4%"); 
})->where('businesses.location', 'like', "%$query1%") 
    ->where('businesses.location', 'like', "%$query2%") 
    ->get(); 
+1

謝謝隊友。我喜歡whereRas和whereRaw。 – user3260759

+0

有很多好的和簡單的方法來實現你的目標與雄辯,一些方法仍然失蹤壽。無論如何,對於你現在想要的東西,請注意'with()'(急切加載)不是要走的路,因爲它會得到比你想要的更多的結果,因爲它會檢查2個獨立查詢,不是一次全部。 –