雄辩的地方在覆盖模型构造函数后不起作用

时间:2018-08-25 19:58:09

标签: laravel laravel-5 constructor eloquent laravel-5.3

我正在尝试使用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;
}

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

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

1 个答案:

答案 0 :(得分:3)

这是完全预期的行为。创建自定义构造函数时,每次创建新模型时(实际上,这是在您调用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;
    }
}