对数据透视表的雄辩或查询

时间:2014-07-26 14:40:49

标签: php mysql laravel laravel-4 eloquent

我有这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"。

现在我想知道如何根据歌曲表和艺术家表的条件进行这样的查询?

2 个答案:

答案 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个查询包含多个或者'但是每个"或"部分之间的连接缺失

也许这有助于其他人