【问题标题】:Laravel Eager Loading - Unexpected Behavior Difference between Code and TinerLaravel Eager Loading - 代码和 Tiner 之间的意外行为差异
【发布时间】:2021-06-05 20:49:04
【问题描述】:

我正在构建一个用于管理用户/角色/权限的前端,并在后端使用 Spatie > Permissions 包。

我正在寻求实现的一个功能是选择一个权限并进行此选择,然后显示所有具有所选权限的用户。

使用php artisan tinker,我可以使用以下语句: Spatie\Permission\Model\Permission::with("roles.users")->find(59);59 代表有问题的权限->id,并返回相应的结果。

我的问题是,当我将此代码带到 php 并寻求 dd((Permission::with('roles.users')->find(59)); 时,我收到 错误 类名必须是有效对象或字符串错误。

使用 dd((Permission::with('roles')->find(59)); 删除嵌套关系被 Laravel 适当处理。但是我想访问具有指定权限的 Users

简而言之,嵌套的急切加载似乎失败了,这完全取决于代码是在 Laravel 还是 Tinker 中。

我正在使用 php v7.3.25 和 Laravel 8.22.1

感谢您的帮助。

【问题讨论】:

  • 无论如何都要尝试Permission::with('roles.users')->find(59)->dd(),你的代码中有额外的左括号。所以,dd(Permission::with('roles.users')->find(59)); 应该可以工作
  • 感谢您的拍摄。这会导致相同的错误:“错误类名称必须是有效的对象或字符串”。我同意它应该可以工作......不确定它是否与 Spatie、Php 或更新的 Laravel 有关。删除与with('roles') 的关系是可行的——只是没有被链接。它仍然在 Tinker 中工作,只是不能来自代码。
  • 这可能是您的关系方法中的某个错误,请也提供。

标签: php laravel eager-loading tinker laravel-permission


【解决方案1】:

好的。问题解决了。感谢那些试图提供帮助的人 - 你坚持认为它应该“正常工作”让我更深入地研究代码。

Spatie Permissions package 做得很好,经过充分研究。由于我是直接使用它而没有进一步修改,因此我认为关系已正确设置,并且确实如此。

问题在于使用的默认身份验证。 Spatie 想使用 Auth::web 而 Laravel 想使用 Auth::sanctum。

通过“角色”连接到用户关系时,我发现我拥有的 Auth 函数不匹配,并引发了一般错误。因此,如果其他人发现这是一个问题,请确保您的身份验证检查具有连续性,并且一切顺利。请注意,这对 Tinker 来说不是问题,这就是为什么最初的行为如此令人困惑的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多