【问题标题】:Laravel geting user role from post model belongsTo relationshipLaravel从帖子模型belongsTo关系中获取用户角色
【发布时间】:2020-07-03 07:46:51
【问题描述】:

我无法从每个帖子的 role_user 表中获取名称。我有 ACL,所以我有 3 个表 - 用户、角色、角色用户。

我的代码如下所示:

后模型

public function user()
{
    return $this->belongsTo(user::class);
}

用户模型。

public function posts()
{
    return $this->hasMany(post::class);
}

榜样。

public function users()
{
    return $this->hasmany(user::class);
}

后控制器,

   return view ('admin.posts',[
        'posts' => Post::All()
    ]);

在刀片中,我通过以下方式回显 fx 用户名:

  @foreach ($posts as $post)
      <tr>
        <th scope="row">{{$post->id}}</th>
        <td>{{$post->category->name}}</td>
        **<td>{{$post->user->name}}</td>**
      </tr>
  @endforeach

但问题是我想为写我正在循环的帖子的用户回显角色名称(来自 role_user 表)。

更新

好的,我解决了问题,但可能有更好的 wat。有人吗?

我添加到模型中:

用户模型:

public function roles()
{
    return $this->belongsToMany(Role::class);
}

并改变了榜样:

public function users()
    {
        return $this->belongsToMany(user::class);
    }

后控制器:

class PostController extends Controller
{
    public function index()
    {
        return view ('admin.posts',[
            'posts' => Post::with('user')->get(),
            'roleUsers' => User::with('roles')->get()
        ]);
    }

在刀片中我正在做

  @foreach ($posts as $post)
      <tr>
        <th scope="row">{{$post->id}}</th>
        <td>
          <p>
            @foreach ($roleUsers as $roleUser)
              @foreach($roleUser->roles as $role)
                <p>  
 {{ $role->pivot->user_id === $post->user->id ? "Role: $role->name" : "" }}
                </p>
              @endforeach
            @endforeach

我想可能有更好的解决方案。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    好的,我解决了我的问题,感谢您的帮助。我发现很多帖子与我的类似,所以我会给出解决方案。

    房地产: 用户属于帖子。 角色属于许多用户。 用户属于多个角色。

    数据库结构: 用户 ID|用户名 角色 ID|名称 role_user id|user_id|role_id

    我试图实现的是在刀片中循环所有帖子以显示属于该帖子的角色名称,解决方案非常简单。

      @foreach ($posts as $post)
          {{$post->user->roles->first()->name}}
      @endforeach
    

    【讨论】:

      【解决方案2】:

      对关系使用withPivot() 方法。如果通过多对多关系获取,它将位于模型上,而不是从枢轴属性中获取。

      public function users()
      {
          return $this->belongsToMany(user::class)->withPivot();
      }
      

      然后我会将前端逻辑更改为某种样式,假设所有帖子都有一个具有给定角色的用户,否则您将需要进行 if 检查。

      @foreach ($roleUsers as $roleUser)
          {{ $roleUser->roles->where('id', $post->user->id)->first()->name }}
      @endforeach
      

      你的问题有很多代码,但这是我的看法,希望它能让你更接近更好地理解它。

      【讨论】:

      • 感谢回复!它非常有帮助 - 它会起作用并且看起来更好。还有一件事——可以在刀片中使用 where()、first() 等吗?我一直认为它会打破模型和视图之间没有直接联系的规则。
      • 没有对错之分,我认为在刀片中处理人际关系是公平的游戏,在多个专业项目中都看到过。开始创建对象等是一个重要的步骤。但是大多数大型项目最终都会完全分离前端和后端。所以刀片对我来说更方便后端开发人员和快速引导利用关系然后是不公平的 tbh :)
      • 感谢您分享您的经验。这对我来说是个好消息 :) 我的第一篇文章就像你说的那样有点复杂,但你的回答让我开始以不同的方式思考 - 问题解决了。
      猜你喜欢
      • 2015-11-29
      • 2017-04-03
      • 2017-09-16
      • 2020-12-24
      • 2020-12-19
      • 2016-12-30
      • 2023-02-16
      • 1970-01-01
      • 2019-01-22
      相关资源
      最近更新 更多