2014-07-26 77 views
0

我有這樣的2種型號雄辯或查詢過的數據透視表

Track 
    id 
    name 
    artist_id 

Artist 
    id 
    name 


class Song extends \Eloquent{ 
    public function artist(){ 
     return $this->hasOne('Artist','id', 'artist_id'); 
    } 
} 
class Artist extends \Eloquent{ 
    public function songs(){ 
     return $this->hasMany('Song', 'artist_id', 'id'); 
    } 
} 

現在我想實現給定的搜索詞「幸福pharrel」的搜索。 很明顯,我必須搜索歌曲名稱爲「開心」或歌手姓名爲「開心」的歌曲,其中歌曲的名稱是「pharrel」或名稱藝術家是「pharrel」。

現在我想知道如何做到這樣的查詢條件歌曲表和藝術家表?

+0

您需要在表格之間創建連接以執行搜索查詢 –

回答

1

你的代碼顯示你已經指定了你的表/類之間的關係 - 這很好,但我認爲它不一定有助於搜索。這是保持語法清晰的好方法,也適用於eager loading,但您最好爲搜索項編寫一個新的查詢,這需要在不同的表上搜索不同的列。

我想沿着這些線路的東西,叫做控制器方法中,當用戶提交自己的搜索:

$keywords = explode(' ', Input::get('search')); 

$results = Song::join('artists', 'songs.artist_id', '=', 'artists.id') 
       ->whereIn('artists.name', $keywords) 
       ->orWhereIn('songs.name', $keywords) 
       ->get(); 

這是相當簡單的,但應該足以讓你開始。

+0

是的,它具有熱切加載和保持代碼清潔的簡單方法,它非常好用,我也可以用這個庫來搜索不同的屬性。你發佈不能正常工作,我會張貼在另一個答案,如果有人也遇到那:) – simon

0

as tbuteler回答這是將結果導入數據庫查詢的最快方法。

foreach($keywords as $p){ 
    $songs->where(function($query) use($p){ 
     $query->where('artists.name',"like", "%".$p."%") 
       ->orWhere('songs.name', "like", "%".$p."%"); 
    }); 
} 

,如果你不這樣做的地方(函數($查詢){...}有1個查詢與許多或的,但是,每個「或」部分缺失

說不定之間的連接,能夠幫助他人else later