我正在尝试使用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
函数似乎在调用我的重载构造函数,而不是默认构造函数。
我的问题是:为什么?如何解决?
答案 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;
}
}