我有这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');
}
}
现在我想实现一个搜索条件" happy 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();
它相当简单,但应该足以让你开始。
答案 1 :(得分:0)
正如tbuteler所说,这是将结果传递给数据库查询的最快方法。
foreach($keywords as $p){
$songs->where(function($query) use($p){
$query->where('artists.name',"like", "%".$p."%")
->orWhere('songs.name', "like", "%".$p."%");
});
}
如果您不执行where(function($ query){...},则有1个查询包含多个或者'但是每个"或"部分之间的连接缺失
也许这有助于其他人