如何在 eloquent ORM 中执行此搜索查询
Posted
技术标签:
【中文标题】如何在 eloquent ORM 中执行此搜索查询【英文标题】:How do I perform this search query in eloquent ORM 【发布时间】:2015-06-26 08:59:04 【问题描述】:我正在尝试使用 eloquent 中的特定用户的书签中的特定标签名称执行搜索查询:
SELECT * FROM
bookmarks_tags
WHERE tag_id in (SELECT id FROMtags
WHERE name in ('new','please','work')) 和 bookmark_id in (SELECT id 来自用户 ID = 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');
这是我的数据库架构:
我知道我可以通过以下方式获取书签和标签 ID:
$bookmarkIDs = Auth::user()->bookmarks()->get('id');
$tagsID = Tag::whereIn('name', $tags)->get('id');
但我不知道如何对bookmarks_tag 执行此查询。
【问题讨论】:
【参考方案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();
【讨论】:
您好,我不小心从 Bookmark 模型中删除了 owner() 关系。你能再看看吗? 现在你把它放在标签模型中。但无论如何,如果关系被称为owner
而不是user
,只需使用whereHas('owner', ...
。我编辑了我的答案
这是我在运行代码时得到的查询: SELECT * FROM bookmarks
WHERE (SELECT count() FROM users
WHERE bookmarks
.id
= @987654330 @.id
and id
= '1') >= 1 and (SELECT count() FROM tags
内部连接bookmarks_tags
tags
.id
= bookmarks_tags
.@ 987654338@ WHERE bookmarks_tags
.bookmark_id
= bookmarks
.id
and name
in ('new', 'please', 'work')) >= 1
不返回任何结果
你确定这不是预期的结果吗?我的意思是应该有匹配的书签吗?以上是关于如何在 eloquent ORM 中执行此搜索查询的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Eloquent ORM laravel 中获取最后一个插入 ID
laravel Eloquent ORM - 如何获得编译查询?
如何根据 laravel eloquent orm 中的两列进行查询