Laravel - 无法覆盖模型的创建方法

Sip*_*hon 3 php laravel laravel-5.4

覆盖基本 Laravel 模型创建方法时,应用程序失败。不会将错误发送回浏览器,并且服务器日志为空。奇怪的是,它在没有覆盖的情况下工作得很好。不知道我做错了什么。

简化的控制器功能:

public function save(Request $request, $id = 0) {
    $myModel = MyModel::find($id);
    $data = $request->all();

    if (!$myModel) // Create a new row
    {
        $myModel = MyModel::create($data);
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,直到我将此函数添加到模型中:

class MyModel extends Model
{
    // ...

    public static function create($attributes = [])
    {
        return parent::create($attributes);
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

只是为了澄清,我不是在寻找一种不同的方式来实现这一点。我只需要知道为什么家长电话对我来说失败了。

这是一些服务器信息...

  • 服务器操作系统:Windows 7(带有 XAMPP 的个人电脑)
  • Laravel 版本 5.4.15
  • PHP 版本 5.6.30

dpa*_*oli 5

解释是类中没有定义公共静态函数create() Illuminate\Database\Eloquent\Model

作为动态方法调用处理,即通过调用函数来处理:

public static function __callStatic($method, $parameters)
Run Code Online (Sandbox Code Playgroud)

Illuminate\Database\Eloquent\Model课堂里。

最后,create()函数在类中定义Illuminate\Database\Query\Builder。这就是您无法在模型中覆盖它并调用parent::create() 的原因

恕我直言,我还没有完全测试过,你可以尝试:

public static function create($attributes)
{
    return (new static)->newQuery()->create($attributes);
}
Run Code Online (Sandbox Code Playgroud)

  • 人们怎么知道这一点呢?我只是花了一个小时的大部分时间试图查找“假设的” **Illuminate\Database\Eloquent\Model::create()** 函数,但在 API 文档中找不到它。没有提到它是一个动态方法调用,而且我怎么知道,从所有_looks_来看,它是 **Model** 类的方法。我很感谢你的解释,只是希望文档足够清楚,这样我就不必向堆栈溢出的陌生人询问一些应该显而易见的恕我直言的事情了。 (2认同)
  • @PKSWE 重写 eloquent 模型的 create() 函数是一个高级主题,因此您必须深入研究源代码。恕我直言,如果文档还应该涵盖高级主题,那么它会比源代码更大。在官方文档中,有一个关于在 Eloquent 模型(即 QueryBuilder 实例)上调用静态方法的提示:https://laravel.com/docs/7.x/eloquent#retriving-models (2认同)
  • 正如你所知,“return (new static)->newQuery()->create($attributes);” 完美! (2认同)