【问题标题】:Laravel - Only query model if table exists [duplicate]Laravel - 如果表存在则仅查询模型[重复]
【发布时间】:2019-07-24 11:36:41
【问题描述】:

所以我的AuthServiceProvider 中有一个boot(),它从数据库中读取了一些Permissions:

    foreach (Permission::all() as $perm) {
        Gate::define($perm->name, function ($user) use ($perm) {
            return $user->hasPermission($perm->name);
        });
    }

唯一的问题是当我执行migrate:fresh 时,一切都会中断(有一个例外),因为这些表不存在。

如何告诉Permission 模型仅在表存在时才加载数据?

【问题讨论】:

  • @dparoli 这是最好的方法吗?要包含迁移级别类?
  • 在 MySQL 中,您可以尝试使用这样的查询:select * from information_schema.tables where table_schema = 'your_database' and table_name = 'your_table' 您可以为此使用数据库查询生成器,但 Schema::hasTable('mytable'); 不依赖于数据库类型。对于您的情况,即使try .... catch
  • 对不起,双重评论。回答你的问题:我甚至在中间件中也使用了 Schema 类,所以你可以使用它,我对这类事情非常有用。
  • 这个逻辑可能不属于您的服务提供者,因为提供者负责配置数据库驱动程序、缓存驱动程序等服务。如果您描述更多关于这段代码设置的细节对于您的应用程序,我可能会建议另一个不会导致这些错误的地方来实现它
  • @TravisBritz 它所做的是遍历我存储在数据库中的所有权限并为它们分配门,因此当它遍历权限时,它会获得一个“名称”字段并分配作为门,门内的逻辑基本上采用用户模型并检查用户是否拥有该权限

标签: php laravel laravel-5


【解决方案1】:

要回答所提出的问题,您可以使用:

if (Schema::hasTable('mytable')) {

}

顺便说一句,以这种方式从数据库中注册门是一种反模式。服务提供者通常还不能访问经过身份验证的用户,因为他们负责准备应用程序,并在诸如对用户进行身份验证的会话中间件之类的东西之前运行。还有许多其他方法可以构建authorization,不会导致此类问题。

【讨论】:

  • 但是can中间件等不使用门吗?并且文档建议在服务提供商中制作大门
  • @Sammaye 是的,门将在 AuthServiceProvider 中定义,但不会在每个用户的每个请求上动态地从数据库中定义。听起来您可以使用单个 middleware with parameters 来替换所有这些回调,但是在不了解您的应用程序以及如何访问这些门的情况下,我不知道最好的解决方案是什么。我也有点跑题了,所以如果您想进一步调查,我建议您提出一个新问题
  • 如果我这样做,我将失去内置 can() 方法的力量和 Laravel 自己对权限处理的支持,诸如 spatie 等扩展明确建议你不要这样做。无论如何,如果我希望深入研究这个问题,我可能会提出一个新问题
猜你喜欢
  • 2023-04-02
  • 2021-11-12
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多