如何在雄辩的ORM中执行此搜索查询

时间:2015-04-19 18:46:46

标签: laravel laravel-4 orm eloquent relationship

我试图在eloquent中使用此查询为特定用户的书签中的特定标记名称执行搜索查询:

  

SELECT * FROM bookmarks_tags WHERE tag_id in(SELECT id FROM tags   名称(' new',' please'' work'))和bookmark_id in(SELECT id   来自书签,其中userid = 1)

我有以下模型设置关系:

标记模型

class Tag extends Eloquent
{

   public function bookmarks()
    {
        return $this
            ->belongsToMany('Bookmark','bookmarks_tags');
    }
}

书签型号:

class Bookmark extends Eloquent {

    .....
     public function owner()
    {
    return $this->belongsTo('User','id');
    }
    public function tags()
    {
        return $this->belongsToMany('Tag','bookmarks_tags','bookmark_id','tag_id');
    }


}

最后是用户模型:

class User extends Eloquent implements UserInterface, RemindableInterface {

    use UserTrait, RemindableTrait;

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';
    .....

    public function bookmarks()
    {
        return $this->hasMany('Bookmark','userid');
    }

}

这是我的数据库架构:

DB Schema

我知道我可以通过以下方式获取书签和标签ID:

$bookmarkIDs = Auth::user()->bookmarks()->get('id');
 $tagsID = Tag::whereIn('name', $tags)->get('id');

但我无法确定如何为bookmarks_tag执行此查询。

1 个答案:

答案 0 :(得分:1)

不确定我是否理解您的要求,但这会为您提供属于具有指定特定标签的用户的书签:

$tags = ['new', 'please', 'work'];
$bookmarks = Bookmark::whereHas('owner', function($q){
    $q->where('users.id', 1);
})->whereHas('tags', function($q) use ($tags){
    $q->whereIn('name', $tags);
})->get();

或者(实际上有点简单)

$bookmarks = Bookmark::whereHas('tags', function($q) use ($tags){
    $q->whereIn('name', $tags);
})->where('userid', 1)->get();