Eloquent 覆盖模型构造函数后哪里不起作用

Eloquent where doesn't work after overwriting model constructor

我正在尝试使用 laravel 5.3 开发 Web 应用程序,但遇到了一个到目前为止无法解决的问题。

这是上下文。

我得到了一个名为 Section 的简单 Laravel 模型,它实现了如下所示的构造函数;

public function __construct($title = null, array $attributes = array()){
    parent::__construct($attributes);
    try {
        \App\logic_model\system\internal\Logger::debug_dump("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        \App\logic_model\system\internal\Logger::debug_dump("create section ".$title);

        $this->title = $title;
        $this->save();

        return $this;
    } catch(\Exception $e){
        \App\logic_model\system\internal\Logger::dev_dump($e->getMessage());
        throw $e;
    }
}

使用构造函数创建实例似乎运行良好。

我写了一个函数find_by_title如下图:

public static function find_by_title($title){
    $section = \App\logic_model\sections\Section::where("title", "=", $title)->first();
    return $section;
}

出现问题(意外行为):Eloquent where 函数似乎调用了我的重载构造函数而不是默认构造函数。

我的问题是:这是为什么?如何解决?

这完全是意料之中的行为。当您创建自定义构造函数时,每次创建新模型时(实际上,这发生在您调用 first(),而不是 where 时),然后此构造函数用于创建新对象。

如果您需要这样的自定义构造函数,我建议您创建静态自定义方法来执行相同的操作,例如:

public static function createWithTitle($title = null, array $attributes = array()){
    $model = new static($attributes);
    try {
        \App\logic_model\system\internal\Logger::debug_dump("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        \App\logic_model\system\internal\Logger::debug_dump("create section ".$title);

        $model->title = $title;
        $model->save();

        return $model;
    } catch(\Exception $e){
        \App\logic_model\system\internal\Logger::dev_dump($e->getMessage());
        throw $e;
    }
}