【问题标题】:Laravel join post table either with user or AdminLaravel 使用用户或管理员加入 post 表
【发布时间】:2019-07-08 02:46:36
【问题描述】:

我正在开发用户和管理员都可以创建帖子的博客。所以我分别创建了3个表usersadminsposts表。在 post 表上,有 2 列 user_idis_adminuser_id 列是用户或管理员的 ID。 is_admin 是布尔列,其中帖子由 0 为用户创建,1 为管理员创建。

表结构如下:

用户

 -id
 -name
 -email
 -password
 -timestamp

管理员

 -id
 -name
 -email
 -password
 -timestamp

帖子

 -id
 -title
 -image
 -body
 -user_id
 -is_admin
 -timestamp

现在我被困在显示帖子用户的名称上。我不知道如何与用户或管理员一起加入帖子表。有没有什么方法可以像这段代码一样获取用户名或管理员名的用户名?

$posts = DB::table('posts')
    ->select('posts.*', 'users.id', 'users.name', 'admins.id', 'admins.name')
    ->leftJoin('admins', function ($join) {
        $join->on('admins.id', '=', 'posts.user_id')
             ->where('posts.is_admin', '=', 1);
    })
    ->leftJoin('usesrs', function ($join) {
        $join->on('users.id', '=', 'posts.user_id')
             ->where('posts.is_admin', '=', 0);
    })
    ->get();

我知道管理员和用户可以使用一张表并具有角色和权限来完成此操作,但我不想更改表结构,因为它会花费更多时间来完成已完成的工作。

有什么方法可以获取帖子的用户名,是管理员还是用户?

【问题讨论】:

  • 你能告诉我们这三个表的结构吗?谢谢。
  • users => id, name, email, password, timestamp admins => id, name, email, password, timestamp posts => id, title, image, body, user_id, is_admin, timestamp
  • 我认为您可以为您的字段提供别名,例如:user.id 作为 post_user_id,admins.name 作为 post_admin_name。然后你可以检查 post_user_id 是否为 0 然后显示管理员的名字。

标签: php mysql laravel


【解决方案1】:

我不知道这是否是一个好的选择,但目前我正在这样做。

    $userPosts = Post::select('posts.*', 'users.name as user_name')
        ->join('users', 'posts.user_id', '=', 'users.id')
        ->where('user_type', '=', '0')
        ->get()
        ->toArray();

    $adminPosts = Post::select('posts.*', 'admins.name as user_name')
        ->join('admins', 'posts.user_id', '=', 'admins.id')
        ->where('user_type', '=', '1')
        ->get()
        ->toArray();

    $posts = collect(array_merge($userPosts, $adminPosts))->sortBy('id')->toArray();

如果您有其他答案,我们随时欢迎您。

谢谢。

【讨论】:

    【解决方案2】:

    您应该normalize 您的数据库结构以避免重复数据。随着时间的推移,您的数据库将开始出现性能问题。

    对于您的情况,我认为您可以将 Admins 表同化到 Users 表中。您可以将is_admin 列从Posts 移动到组合的Users 表中,这样您仍然可以为管理员用户设置一个标志,或者更好的是,拥有一个Roles 表,您可以在其中定义用户的角色.像这样:

    用户表:

     -id
     -name
     -email
     -password
     -role_id
     -timestamp
    

    角色表:

     -id
     -name
    

    帖子表:

     -id
     -title
     -image
     -body
     -user_id
     -timestamp
    

    使用这种数据库结构,您可以轻松地编写查询,而不会使其过于复杂。这样做并不需要太多,这实际上是一个非常好的做法。

    $authors = Post::select('posts.*' ,'users.name as user_name')
                   ->join('users', 'posts.user_id', '=', 'users.id')
                   ->orderBy('id', 'asc')
                   ->get()
                   ->toArray();
    

    【讨论】:

      猜你喜欢
      • 2020-07-10
      • 2014-12-13
      • 2021-06-04
      • 1970-01-01
      • 2016-08-19
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多