不存在的模型类的雄辩关系

2024-01-31

我希望在我的应用程序中拥有许多模型/模块,但其中一些模型/模块将被某些客户删除。

现在我有这样的关系:

public function people()
{
    return $this->hasMany('People', 'model_id');
}

当我跑步时$model = Model::with('people')->get();工作正常

但如果People模型不存在?

目前我得到:

ClassLoader.php 第 386 行中的 1/1 ErrorException:include(...):失败 打开流:没有这样的文件或目录

我尝试过

public function people()
{ 
    try {
       return $this->hasMany('People', 'model_id');
    }
    catch (FatalErrorException $e) {
        return null;
    }
}

or with:

public function people()
{ 
    return null; // here I could add checking if there is a Model class and if not return null
}

但是当使用这样的方法时$model = Model::with('people')->get();不起作用。

我将有几十个关系,但我无法列出可供使用的关系with。最好的方法是使用一些empty relation(返回 null)只是为了让 Eloquent 不做任何事情,但在这种情况下 Eloquent 仍然试图让它工作,我会得到:

哎呀,看起来像出事了。 Builder.php 第 430 行中的 1/1 FatalErrorException:调用成员函数 addEagerConstraints() 为 null

有什么简单的解决方案吗?


我能想到的唯一解决方案是创建你自己的Eloquent\Builder class.

我已经这样称呼它了MyBuilder。让我们首先确保它得到实际使用。在您的模型(最好是基本模型)中添加此newEloquentBuilder method:

public function newEloquentBuilder($query)
{
    return new MyBuilder($query);
}

在风俗中Builder类我们将覆盖loadRelation方法并添加一个if null之前检查一下addEagerConstraints被称为关系(或者在你的情况下null)

class MyBuilder extends \Illuminate\Database\Eloquent\Builder {
    protected function loadRelation(array $models, $name, Closure $constraints)
    {
        $relation = $this->getRelation($name);


        if($relation == null){
            return $models;
        }


        $relation->addEagerConstraints($models);

        call_user_func($constraints, $relation);

        $models = $relation->initRelation($models, $name);

        $results = $relation->getEager();

        return $relation->match($models, $results, $name);
    }
}

该函数的其余部分基本上与原始构建器中的代码相同(Illuminate\Database\Eloquent\Builder)

现在只需在关系函数中添加类似的内容,它就应该可以正常工作:

public function people()
{
    if(!class_exist('People')){
        return null;
    }
    return $this->hasMany('People', 'model_id');
}

更新:使用它like一种关系

如果你想像处理人际关系一样使用它,那就有点棘手了。

你必须覆盖getRelationshipFromMethod函数于Eloquent\Model。因此,让我们创建一个基本模型(您的模型显然需要扩展它......)

class BaseModel extends \Illuminate\Database\Eloquent\Model {
    protected function getRelationshipFromMethod($key, $camelKey)
    {
        $relations = $this->$camelKey();

        if ( $relations instanceof \Illuminate\Database\Eloquent\Collection){
            // "fake" relationship
            return $this->relations[$key] = $relations;
        }
        if ( ! $relations instanceof Relation)
        {
            throw new LogicException('Relationship method must return an object of type '
                . 'Illuminate\Database\Eloquent\Relations\Relation');
        }

        return $this->relations[$key] = $relations->getResults();
    }
}

现在我们需要修改关系以返回一个空集合

public function people()
{
    if(!class_exist('People')){
        return new \Illuminate\Database\Eloquent\Collection();
    }
    return $this->hasMany('People', 'model_id');
}

并改变loadRelation函数于MyBuilder检查类型集合而不是null

protected function loadRelation(array $models, $name, Closure $constraints)
{
    $relation = $this->getRelation($name);

    if($relation instanceof \Illuminate\Database\Eloquent\Collection){
        return $models;
    }

    // ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不存在的模型类的雄辩关系 的相关文章

  • 在 Laravel 视图中使用 CSS?

    我刚刚开始学习 Laravel 并且可以掌握控制器和路由的基础知识 我的操作系统是 Mac OS X Lion 它位于 MAMP 服务器上 我的routes php代码 Route get function return View make
  • 使用 laravel 检查活动用户状态

    这是非常标准的登录功能和验证 效果很好 但我还想检查用户是否处于活动状态 我在用户表中设置了一列 并将 活动 设置为 0 或 1 public function post login input Input all rules array
  • 如何在 Laravel 5.4 中使用 bootstrap 4?

    我在我的 laravel 应用程序上使用 npm 安装了 bootstrap 4 但我认为 bootstrap 3 的工作落后于 bootstrap 4 使用命令 npm install npm install email protecte
  • AngularJS 和 Laravel - 跨域 CORS / XHR 请求缺少(记住)cookie

    当我不使用 Chrome 中的 disable web security 选项时 我的 CORS XHR 请求在请求标头中缺少 Remember xyz cookie 如果我启用该选项 remember xyz cookie 将包含在请求标
  • Laravel 验证:对 null 的成员函数调用失败()

    这段代码几天前还可以工作 但我似乎做了一些事情导致它崩溃 我有这条路线 Route post admin routemanagement AdminController addRoute 看起来像这样 public function add
  • Codeception API 测试响应返回“N/A”

    我正在使用 Laravel 和 Codeception 作为测试框架编写 API 我无法让 Codeception 返回响应代码 我可以从 Codeception 获取响应代码 以及 JSON 响应 我编写了一个简单的测试来从 GET 请求
  • Laravel:运行队列:在 Windows Azure Web App 上连续监听

    我觉得问这个问题有点傻 但我似乎无法在互联网上找到这个问题的答案 经过几个小时的搜索后 我发现在 Linux 服务器上 您使用 Supervisor 在您的网站上连续运行 php artisanqueue listen 无论有或没有守护进程
  • 我可以在 Laravel 5.2 中创建一个继承自 User 的新类吗?

    我对 Laravel 还很陌生 使用的是迄今为止的最新版本 5 2 因此我遇到了以下困境 我知道 Laravel 附带了一个User开箱即用的类 但我想开发一个系统 在其中我可以有另外两种类型的用户 称为Researcher and Adm
  • 多种邮件配置

    我使用 mandrill 驱动程序配置了 laravel 的邮件服务 这里没有问题 现在 在我申请的某个时刻 我需要通过 gmail 发送邮件 我做了类似的事情 backup current mail configs backup Conf
  • 如何使用 Laravel Mix 和 WorkBox?

    我正在尝试为我的应用程序构建一个 PWA 并花了近 48 小时试图弄清楚如何将 Workbox 与 Laravel Mix 结合使用 具有讽刺意味的是 谷歌说 Workbox 是为了让事情变得简单 Buh 好吧 到目前为止我已经弄清楚了 我
  • Laravel 转义 Blade 模板中的所有 HTML

    我正在 Laravel 中构建一个小型 CMS 并尝试显示内容 存储在数据库中 它显示 HTML 标签而不是执行它们 就像所有打印数据都有一个自动 html entity decode 一样
  • 在 laravel 中禁用特定路由的 csrf

    我有一个支付系统 数据被提交到第三方网站然后被拉回 当数据返回时 它会到达特定的 url 比如 ok 路由 REQUEST transaction 但由于 Laravel 中间件 我遇到了令牌不匹配的情况 第三方支付API无法生成token
  • 将 Laravel 集合/数组转换为 Javascript 数组

    我想将 Laravel 中的数组分配给 JavaScript 数组 我已经从我的AppServiceProvider和 json decoded 它像 View composer function view users Users all
  • laravel 5.3 新的 Auth::routes()

    最近开始使用laravel 5 3写博客 但是运行后出现一个问题php artisan make auth 当我运行这个时 它会在我的web php 这是其中的代码 Auth routes Route get home HomeContro
  • 从关系中合并 Laravel 中的集合

    假设我有 3 张桌子 Images Subject Style 关系是多对多 图像 主题 和多对多 图像 样式 现在我想做一些类似的事情 result subjectResult gt images gt merge styleResult
  • 如何在 Laravel 中 session_write_close() ?

    Running session write close before sleep 在 Laravel 中似乎不起作用 因为会话仍然被其他请求阻止 直到当前连接完成 我试图sleep 在 Laravel 中 不会阻止其他请求 发现 sessi
  • 拉拉维尔; “SQLSTATE[HY000] [2002] 连接被拒绝”

    我在 OSX 主机上设置了 homestead 2 0 并使用 Sequel Pro 我可以进行迁移并确认数据已在Sequel Pro中迁移 因此看起来数据库连接没有问题 但是 一旦我尝试从 Laravel 4 2 应用程序获取数据 它就无
  • 如何在 Laravel Mix 中将公共路径更改为包含下划线的路径?

    Laravel 5 4 中引入了 Mix 来编译资产并维护资产管道 Mix 默认为您的公共目录被命名public 在许多情况下 包括我的 我的公共目录被称为其他名称 就我而言 是public html 如何更改资源编译到的公共目录 我尝试过
  • Laravel 5.6 - 注册表无法正常工作并且不显示任何错误

    在我最近的一个项目中 定制登记表不管用 当我单击注册按钮时 它会重新加载注册表单 不会打印任何错误 并且不会将数据插入数据库中 这是注册表的外观 这里是移民文件代码 public function up Schema create user
  • Laravel Passport,通过密码客户端进行多个连接

    我无法理解如何使用 Laravel Passport 通过密码客户端为同一用户实现多个连接 我有一个移动应用程序 需要与基于 Laravel 的 API 进行通信 我的用户在首次启动应用程序时必须输入他们的login and passwor

随机推荐

  • 如何在 ASP.NET MVC 中枚举表单集合?

    我如何枚举所有的键 值 一个 FormCollection system web mvc ASP NET MVC http en wikipedia org wiki ASP NET MVC Framework 以下是专门使用 FormCo
  • 测量java短时运行线程执行时间

    我目前正在开发某种数据库基准测试应用程序 基本上 我想做的是使用线程模拟一定数量的客户端 这些客户端在特定时间段内对数据库重复相同的操作 例如 读取操作 在此期间 我想在每个线程中测量从数据库获取答案的平均延迟 我的第一选择是依赖 Thre
  • Go,Golang:结构内的数组类型,缺少类型复合文字

    我需要向该结构添加切片类型 type Example struct text string func main var arr Example a b c fmt Println arr 然后我得到 prog go 11 missing t
  • Visual Studio 2010 构建无法进行文件复制错误

    我正在 Visual Studio 2010 中构建一个项目 但构建失败 因为它无法将 assemblyname dll 文件从 obj 复制到 bin 文件夹 确切的错误消息是 错误7 无法将文件 obj Debug AssemblyNa
  • 获取不包含给定列值的子集

    我有一张桌子叫data A 22 B 333 C Not Av D Not Av 我怎样才能获得一个子集 其中所有行都包含 Not Av 被排除在外 值得一提的是 我有要检查的列的索引 在本例中colnum 2 但我不知道它的名字 我尝试了
  • 为什么 .NET 框架中没有托管 MD5 实现?

    重写的问题 请参阅原始历史 问题就在标题里 为什么 NET 框架中没有托管 MD5 实现 我具体说的是一个纯托管代码MD5算法的实现 NET框架中不存在该算法 在 System Security Cryptography 命名空间中 我知道
  • 使用 SQLite 修复数据路径未找到错误

    我已经让 sqlite 数据库在编辑器中工作得很好 然而 当在 Android 中使用它时 我收到一条错误消息 指出未找到数据路径 我相信我在正确的plugins android 文件夹中拥有所需的 libsqlite so 文件以及编辑器
  • 无法在 Apache Airflow 中设置 DB2/DashDB JDBC 连接

    我正在尝试使用 Airflow UI 创建 DB2 DashDB 连接 我添加了 db2jcc4 jar 驱动程序并提供了路径以及类名 com ibm db2 jcc DB2Driver class 我尝试运行一个简单的查询 在临时 UI
  • 获取页面上特定类型的所有Web控件

    我一直在思考如何获取页面上的所有控件 然后在此相关问题中对它们执行任务 如何以编程方式搜索 C DropDownList https stackoverflow com questions 869122 how to search thro
  • 为什么我的子域重定向到我的主域?

    所以基本上 我有一个子域 m mydomain com au尽管每次我访问它时 我都会被重定向到www mydomain com au m 例如 如果我尝试去m mydomain com au contact php 我会自动重定向到www
  • Python Bottle - 如何在不关闭服务器的情况下上传媒体文件

    我正在使用来自的答案这个问题 https stackoverflow com questions 14296438 bottle file upload and process并看到评论 raw data file read This is
  • UIImage 调整纵横比填充和裁剪

    我有这个代码 我拍摄了一张尺寸为 2448x3264 的照片 我需要调整大小并调整到左上角的屏幕显示 对不起我的英语谢谢 void imagePickerController UIImagePickerController picker d
  • 如何解决“应用程序在使用 Google Play 服务时遇到问题。请重试。”

    我已经用react native做一个项目大约4个月了 现在使用 react native 0 57 4 它由我正在渲染 修改 开发的地图视图组成 react native maps 0 22 1 突然我现在遇到了这个错误 App is h
  • 如何在 python/django 中 fork 一个进程?

    然而 在 django 的上下文中 这更像是一个 Python 常见问题 现在我在 django 中有这个视图 它必须处理大量数据 通常 服务器 使用代理运行的 nginx 和 django 需要几分钟才能完成此操作 有时服务器会超时 我不
  • adb 无法在 Ubuntu 64 上运行 - 找不到命令

    Update 在做了更多实验之后 我必须完全重新表述我的问题 因为我被终端愚弄了 只是我发出来的时候并没有显示错误信息须藤 adb 如果我 cd 进入 ANDOID SDK platform tools 目录并运行 adb I get co
  • CSS - 如何强制元素达到父元素剩余/可用空间的 100%,而不超出它?

    在我看来 这似乎是一个非常业余的问题 但尽管如此 它仍然是一个令人沮丧的异常情况 这实际上是两部分问题的第二部分 第一部分是一个相当常见的部分 涉及让元素拉伸到其父对象的 100 高度 在我的演示中 我有以下 HTML div DIV 1
  • jQuery UI datepicker:配置键盘快捷键

    我用jQuery UI 日期选择器 http jqueryui com demos datepicker 让用户选择一个日期 它有一些快捷键 以便可以使用键盘进行控制 page up down previous next month ctr
  • 动态库映像不包含x86_64、i386架构

    我正在尝试为 iOS 构建动态库 并结合架构 armv7 armv7s arm64 i386 x86 64 Here is my target s Build Settings 如您所见 我已将 x86 64 和 i386 添加到架构 an
  • 在 iPad 上调试 JavaScript 错误

    有什么方法可以调试在 iPad 上运行的 JavaScript 页面吗 转到此位置 并启用调试控制台 iOS6 调试控制台消失了 使用替代方案使其发挥作用 例如 Firebug Lite 看看这里的相关问题 iOS6 删除了 iPad 的控
  • 不存在的模型类的雄辩关系

    我希望在我的应用程序中拥有许多模型 模块 但其中一些模型 模块将被某些客户删除 现在我有这样的关系 public function people return this gt hasMany People model id 当我跑步时 mo