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