Конструкторы классов, расширяющих Eloquent

Я только что запустил новый веб-сайт и хотел использовать Eloquent. В процессе заполнения моей базы данных я заметил, что добавлю пустые строки, если включу в модель какой-либо конструктор, который расширяет красноречие. Например, запуск этого сеялки:

<?php

class TeamTableSeeder extends Seeder {

    public function run()
    {
        DB::table('tm_team')->delete();

        Team::create(array(
            'city' => 'Minneapolis',
            'state' => 'MN',
            'country' => 'USA',
            'name' => 'Twins'
            )
        );

        Team::create(array(
            'city' => 'Detroit',
            'state' => 'MI',
            'country' => 'USA',
            'name' => 'Tigers'
            )
        );
    }

}

С этим как с моим классом Team:

<?php

class Team extends Eloquent {

    protected $table = 'tm_team';
    protected $primaryKey = 'team_id';

    public function Team(){
        // null
    }
}

Выдает это:

team_id | city  | state | country   | name  | created_at            | updated_at            | deleted_at
1       |       |       |           |       | 2013-06-02 00:29:31   | 2013-06-02 00:29:31   | NULL
2       |       |       |           |       | 2013-06-02 00:29:31   | 2013-06-02 00:29:31   | NULL

Простое удаление конструктора позволяет сидеру работать как положено. Что именно я делаю неправильно с конструктором?


person vikingsfan19    schedule 03.06.2013    source источник
comment
Поскольку у Eloquent есть собственный конструктор, и то, что вы делаете, отключает все действия, которые должны работать.   -  person crynobone    schedule 03.06.2013


Ответы (3)


Вы должны вызвать parent::__construct, чтобы все заработало здесь, если вы посмотрите на конструктор класса Eloquent:

public function __construct(array $attributes = array())
{
    if ( ! isset(static::$booted[get_class($this)]))
    {
        static::boot();

        static::$booted[get_class($this)] = true;
    }

    $this->fill($attributes);
}

Вызывается метод boot и устанавливается свойство booted. Я действительно не знаю, что это делает, но в зависимости от вашей проблемы это кажется актуальным: P

Рефакторинг вашего конструктора, чтобы получить массив attributes и поместить его в родительский конструктор.

Обновить

Вот необходимый код:

class MyModel extends Eloquent {
    public function __construct($attributes = array())  {
        parent::__construct($attributes); // Eloquent
        // Your construct code.
    }
}
person Jan P.    schedule 03.06.2013
comment
+1 за обновление, но -1 за первый код. Причина: возможность повторного использования... если красноречивый __construct() изменится, он будет несовместим - person Ifnot; 18.04.2014
comment
Если вы правильно прочитаете мой ответ, то увидите, что я просто скопировал конструктор Eloquent для демонстрации :) - person Jan P.; 19.04.2014
comment
О блин, да ты прав. Объяснение конца строки и упоминания об обновлении смутили меня. Первый код в ответах обычно представляет собой быстрый ответ на копирование/вставку. Возможно, вам следует заменить его ссылкой на github (как я сделал в редактировании). - person Ifnot; 19.04.2014
comment
Безопасным способом вызова родительского конструктора будет call_user_func_array(array('parent', '__construct'), func_get_args()); - person wkjagt; 14.07.2014
comment
@wkjagt Но как бы вы определили ожидаемые аргументы новых конструкторов в этом конкретном случае? - person AturSams; 26.08.2014
comment
Та же проблема возникает и в Laravel 5.1, но это же исправление работает. Спасибо за это. Это сводило меня с ума около часа, и я как раз собирался серьезно разобрать свой код. - person racl101; 20.12.2015

В laravel 3 вы должны указать второй параметр $exists со значением по умолчанию «false».

class Model extends Eloquent {

    public function __construct($attr = array(), $exists = false) {
        parent::__construct($attr, $exists);
       //other sentences...
    }
}
person Chemaclass    schedule 01.07.2014

Вы можете использовать этот общий метод, который также позволяет передавать параметр.

/**
* Overload model constructor.
*
* $value sets a Team's value (Optional)
*/
public function __construct($value = null, array $attributes = array())
{
     parent::__construct($attributes);
     $this->value = $value;
     // Do other staff...    
}
person overcomer    schedule 27.04.2017