Красноречивый, где не работает после переписывания конструктора модели - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь разработать веб-приложение, используя laravel 5.3, и столкнулся с проблемой, которую до сих пор не удалось решить.

Вот контекст.

Я получил простую модель Laravel под названием Section, которая реализует конструктор, как показано ниже;

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 вызывает мой перегруженный конструктор вместо конструктора по умолчанию.

Мой вопрос: почему это так? Как это исправить?

1 Ответ

0 голосов
/ 25 августа 2018

Это вполне ожидаемое поведение. Когда вы создали собственный конструктор, каждый раз, когда создается новая модель (на самом деле, это происходит при вызове 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;
    }
}
...