【问题标题】:eloquent or-query over pivot table雄辩的或查询数据透视表
【发布时间】:2014-07-26 14:40:49
【问题描述】:

我有这两个模型

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”的情况下实现搜索。 我很清楚,我必须搜索歌曲名称为“happy”或艺术家名称为“happy”的歌曲歌曲名称为“pharrel”的歌曲或者艺术家的名字是“pharrel”。

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

【问题讨论】:

  • 您需要在表之间创建连接才能执行搜索查询。

标签: php mysql laravel laravel-4 eloquent


【解决方案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();

这相当简单,但应该足以让您入门。

【讨论】:

  • 是的,急切加载和保持代码清洁的简单方法非常好。我只是虽然这也可以用来搜索不同的属性。您发布的解决方案无法正常工作,如果有人也遇到该问题,我会将其发布在另一个答案中:)
【解决方案2】:

正如 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 个查询包含多个或,但每个“或”部分之间的连接缺失

也许以后会对其他人有所帮助

【讨论】:

    猜你喜欢
    • 2014-05-10
    • 1970-01-01
    • 2015-09-21
    • 2018-05-17
    • 1970-01-01
    • 2020-03-19
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多