【问题标题】:How can I pass hasOne relationship data from laravel controller to Vue frontend如何将 hasOne 关系数据从 laravel 控制器传递到 Vue 前端
【发布时间】:2020-11-17 00:42:26
【问题描述】:

我正在尝试使用 Laravel 和 Vue 制作一个类似应用程序的博客,但遇到了问题。在开发管理面板时,我想要一个“分配角色”功能,管理员可以在其中分配具有特定角色的用户,例如“管理员、版主或作者” 为此,我在 User 模型中定义了一个关系

public function role() {
    return $this->hasOne(Role::class);
}

现在在 Vue 中,我想显示一个表格,其中包含所有用户名及其角色。为此,我向 laravel 服务器发送了一个请求以从用户表中获取所有数据,用户表具有以下字段

id , name, role_id , email , password, created_at, updated_at

我在角色模型中也定义了一个关系

public function Users() {
    return $this->hasMany(User::class);
}

现在当我获取所有用户时,我会这样做

$users = User::all();
return $users;

如何从我上面发送的数据中获取表中的角色名称。 现在,我只得到 1,2 或 3 的 role_id,但我想要角色的名称。

提前致谢

【问题讨论】:

  • 我在其他地方说过这个评论,但我不确定你是否做到了:public function role() { return $this->belongsTo(Role::class); }你使用了错误的关系类型
  • @TKoL,为什么我不应该在这里使用 hasOne?用户“拥有一个”角色不是更有意义吗?
  • 不存在一对多的关系 bw 角色和用户。所以每个用户都属于一个特定的角色,而一个角色有很多用户。 hasOne 用于一对一的关系。
  • 'belongsTo' 与 'hasOne' 取决于哪一列有另一列的 id。 'belongsTo' 当您所在的模型“用户”包含与您相关的模型“角色”的 ID 列时。 'hasOne' 如果 Roles 表有一个 user_id 列,您可以在错误消息中看到

标签: javascript laravel vue.js


【解决方案1】:
$users = User::all();
foreach($users as $user) {
    $user->role;
}
return $users;

信不信由你,这就是在任何生成的 JSON 中填充关系所需要做的一切。你只需要调用“魔术方法”

【讨论】:

  • 但您不返回该角色?像这样工作吗?
  • 你正在返回用户对象,就像以前一样,现在它可以作为user.role 访问——连接到用户的整个角色对象将在那里,对于每个用户,在你的javascript
  • 这个问题我已经遇到过很多次了,而且我绝对肯定这行得通。
  • 它抛出一个错误说 SQLSTATE[42S22]: Column not found: 1054 Unknown column 'roles.user_id' in 'where Clause' (SQL: select * from roles where roles.@ 987654325@ = 1 和 roles.user_id 不为空限制 1)"
  • 你们的关系不对。而不是'hasOne',它应该是'belongsTo'。 public function role() { return $this->belongsTo(Role::class); }
【解决方案2】:

你需要改变你们的关系。

用户模型

public function role(){
   return $this->belongsTo(App\Role::class, 'role_id', 'id')
}

您可以使用角色关系并从那里获取名称。

// Eager load the relation
$users = User::with('role')->get();
return $users;

在您的 html 中。

$user->role->name;

【讨论】:

  • SQLSTATE[42S22]:找不到列:1054 'where 子句'中的未知列'roles.user_id'(SQL:select * from roles where roles.user_id in (1 ))
  • 你需要改变你的关系。我已经更新了答案。
【解决方案3】:

我认为你的一段关系对于初学者来说是错误的,应该是

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

要最小化数据库查询,请执行以下操作:

$users = User::with('role)->get();

现在你可以做类似的事情

$users->toJson()

如果您想将所有数据传递给 javascript。

或者你可以这样做

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

重要的是with语句预先加载了所有的关系,所以只执行一个数据库查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 2018-07-31
    • 1970-01-01
    • 2021-12-11
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多