在 Laravel 中调用未定义的方法 App\User::role()

Posted

技术标签:

【中文标题】在 Laravel 中调用未定义的方法 App\\User::role()【英文标题】:Call to undefined method App\User::role() in Laravel在 Laravel 中调用未定义的方法 App\User::role() 【发布时间】:2020-01-14 05:56:37 【问题描述】:

我想创建一个具有特定角色的用户列表(如果给定多个角色,则为角色)

在我的用户控制器中

use DB;
use Auth;
use Storage;

use App\Role;
use App\HasRoles;
use App\User;
use App\Profile;

$users = User::with('roles')->where('name', 'admin')->get();
return view('dashboard.users.index', compact('users')); 

但是我遇到了这个错误

如果我dd($users);

我可以看到角色在那里

我该如何解决这个问题?谢谢!

编辑:用户模型

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements MustVerifyEmail

    use Notifiable, HasRoles;

    protected $fillable = [
        'name', 'email', 'phone_number', 'avatar', 'password', 'verification_code'
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
        'phone_verified_at' => 'datetime',
    ];

    public function profile()
    
        return $this->hasOne('App\Profile', 'user_id','id');
    

    public function mailingAdd()
    
        return $this->hasOne('App\MailingAddress', 'user_id','id');
    

用户/index.php

@foreach($users->role as $item)
    <tr>
        <td> $loop->iteration </td>
        <td><a href=" url('/dashboard/users', $item->id) "> $item->name </a></td>
        <td> $item->email </td>
        <td> $item->role()->name </td>
        <td> $item->phone_number==null ? 'None' : $item->phone_number  </td>
        <td>
            @if($item->phone_verfied_at==null)
                <span class="badge badge-danger">not yet verified</span>
            @else
                <span class="badge badge-success">verified</span>
            @endif
        </td>
    </tr>
@endforeach     

@foreach($users-&gt;role as $item) 更改为 @foreach($user-&gt;roles as $item) 会显示“此集合实例上不存在属性 [角色]”

用户表迁移

角色和权限表迁移

回答

来自 Simon Morris 的回答。

@foreach($users as $user)
     $user->name 
    @foreach ($user->roles as $role)
         $role->name 
    @endforeach
@endforeach

我从这里的一些建议中删除了我添加基础的关系。并实施我上面粘贴的答案。

如果用户赋予多个角色,该代码会显示用户列表及其特定用户角色或角色。

感谢大家的回答!干杯!

【问题讨论】:

您可以点击应用程序框架并提供另一个屏幕截图吗? 你能告诉你用户模型和user/index.blade.php 嗨@mukeshkumar 我刚刚更新了我的问题。对不起charitra 我不明白你的意思。你想看什么屏幕? 你需要在你的模型中创建角色关系方法,比如配置文件,然后你可以使用这个 $users = User::with('roles')->where('name', 'admin')- >get(); . 嗨 @mukeshkumar 我添加了 public function roles() return $this->belongsToMany('App\Role'); 在我的用户模型中。它给了我“此集合实例上不存在属性 [角色]。”但我做 DD($users);但是为什么我可以看到关系中的角色? 【参考方案1】:

你打电话给$user-&gt;role()而不是$user-&gt;roles()

要将它们作为一个数组进行循环,您需要这样做

foreach($user->roles as $role)
  // do something with role here

【讨论】:

嗨@simon 这给了我“此集合实例上不存在属性 [角色]” 因为你有一个用户集合,你需要修改你的 index.blade.php 来做 foreach($users as $user) foreach($user->roles as $role) // 在这里对角色做一些事情 或者通过 id 找到用户或者调用 User::with('roles')->where('name', 'admin')->first() // 不是最好的方法但是这将工作【参考方案2】:

从表面上看,我认为您错误地引用了 dashboard.users.index 视图中的关联:如果您有:

$user->role() 

改成:

$user->roles() 

或者只是在模型中更改您的关系名称。如果关系类型是hasOne,请将其重命名为user(),因为它始终只有一个角色,不需要复数。

【讨论】:

【参考方案3】:

在 Laravel8 中获取错误 一对多获取用户和评论之间的数据

UserController.php 之前

 $comment = User::find($id)->comments;  
 return $comment;

UserController.php 之后

$comment = User::find($id)->comment;  
 return $comment;

【讨论】:

以上是关于在 Laravel 中调用未定义的方法 App\User::role()的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5.3 中调用未定义的方法 Illuminate\Database\Query\Builder::attach()

Laravel 调用未定义的方法。方法存在

调用未定义的方法 Gallery::newQuery() Laravel

Laravel - 调用未定义的方法 TrainingFacade::save()

Laravel Request::input 调用未定义的方法

Laravel:调用未定义的方法 Illuminate\\Database\\Query\\Builder