首页 > 解决方案 > 如何在laravel中获取用户职业为特例的帖子

问题描述

这是一个社交媒体应用程序。

  1. users表有idnameemailpassword字段。
  2. posts表有iduser_idcaption和其他字段。
  3. 职业表有id , title字段
  4. users_professions表有iduser_id 字段
  5. 每个用户都有很多帖子。
  6. 用户“ hasMany ”发布,发布“ belongsTo ”一个用户。
  7. 每个用户都有一个users_professions
  8. 用户“ hasOneusers_professions

问题:

我想获得他们的用户职业等于所选 ID 的“帖子”。

我当前的代码:

$posts = Post::join('users', 'users.id', '=', 'posts.user_id')
    ->join('users_professions', 'users.id', '=', '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);

这段代码正确吗?

标签: sqllaravelorm

解决方案


我看不出你的代码有什么问题。如果您所关心的只是Posts根据与他们的关系相关的条件来检索,您可以使用该whereHas方法。

Eloquent 关系 - 查询关系是否存在

假设您的模型中定义了以下关系:

  • 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(或hasOneProfessionUser(如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()

推荐阅读