问题描述
这是一款社交媒体应用。
- users 表具有 id、姓名、电子邮件、密码 字段。
- posts 表具有 id、user_id、caption 和其他字段。
- professions 表有 id 、title 字段
- users_professions 表具有 id 、user_id 字段
- 每个用户都有很多帖子。
- 用户“hasMany”帖子,发布“belongsTo”用户。
- 每个用户都有一个users_professions。
- 用户“hasOne”users_professions。
问题:
我想获得他们的用户职业等于所选 ID 的“帖子”。
我当前的代码:
$posts = Post::join('users','users.id','=','posts.user_id')
->join('users_professions','users_professions.user_id')
->where('users_professions.profession_id',$request->category_id)
->where('files',"<>","[]")
->where('is_product',0)
->select('posts.id','posts.title','posts.user_id','posts.is_product','posts.media_display_mode','posts.files','posts.created_at')
->orderBy('posts.id','desc')
->paginate(50);
这个代码正确吗?
解决方法
我看不出你的代码有什么问题。如果您只关心根据与它们的关系相关联的条件检索 Posts
,则可以使用 whereHas
方法。
Eloquent Relationships - Querying Relationship Existence
假设您的模型中定义了以下关系:
-
Post
belongsTo
User
(如user()
) -
User
belongsToMany
Profession
(如professions()
)
// Query only the posts that belong to an user who has a profession with id = $profession_id
Post::whereHas('user.professions',function ($professions) use ($profession_id) {
$professions->where('professions.id',$profession_id);
})
...
->get()
或者假设您的模型中定义了以下关系:
-
Post
belongsTo
User
(如user()
) -
User
hasMany
(或hasOne
)ProfessionUser
(如professions_user()
)
// Query only the posts that belong to an user who has a profession_user with profession_id = $profession_id
Post::whereHas('user.professions_user',function ($professions_user) use ($profession_id) {
$professions_user->where('profession_user.professions_id',$profession_id);
})
...
->get()