2013-06-03 22 views
16

Właśnie założyłem nową stronę internetową i chciałem skorzystać z Eloquent. W procesie rozsiewania mojej bazy danych zauważyłem, że otrzymam puste wiersze dodane, gdybym zawarł jakiś konstruktor w modelu, który rozszerza elokwencję. Na przykład, bieganie to punktowe:Konstruktory w klasach rozszerzających Eumquent

<?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' 
      ) 
     ); 
    } 

} 

z tego, ponieważ mojej klasie drużyny:

<?php 

class Team extends Eloquent { 

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

    public function Team(){ 
     // null 
    } 
} 

Daje to:

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 

prostu usuwając konstruktora wszystko razem pozwala siewnik do pracy jako spodziewany. Co dokładnie robię źle z konstruktorem?

+0

Ponieważ Eloquent ma swój własny konstruktor, a to, co robisz, niweczy wszystkie działania, które wymagają wymownej pracy. – crynobone

Odpowiedz

25

Trzeba zadzwonić parent::__construct aby rzeczy tu pracować, jeśli spojrzeć na konstruktora klasy 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); 
} 

Sposób boot nazywa i właściwość booted jest ustawiony. Naprawdę nie wiem, co to robi, ale w zależności od twojego problemu wydaje się to istotne: P

Rozwinąć konstruktor, aby uzyskać tablicę attributes i umieścić ją w konstruktorze nadrzędnym.

Aktualizacja

Oto potrzebny kod:

class MyModel extends Eloquent { 
    public function __construct($attributes = array()) { 
     parent::__construct($attributes); // Eloquent 
     // Your construct code. 
    } 
} 
+0

+1 Dla aktualizacji, ale -1 dla pierwszego kodu. Powód: możliwość ponownego użycia ... jeśli wymowna "__construct()" zmieni się, będzie niekompatybilna – Ifnot

+0

Jeśli dobrze przeczytasz moją odpowiedź, zobaczysz, że właśnie skopiowałem konstruktora Eloquent do demonstracji :) –

+0

Cholera, tak masz rację . Wyjaśnienie końca linii i wzmianki o aktualizacjach wprawiły mnie w zakłopotanie. Pierwszy kod w odpowiedziach to na ogół szybka odpowiedź "kopiuj/wklej". Może powinieneś zastąpić go linkiem github (tak jak zrobiłem w edycji). – Ifnot

1

W laravel 3 należy umieścić drugi parametr '$ istnieje' o wartości domyślnej "false".

class Model extends Eloquent { 

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

Możesz użyć tej ogólnej metody, która pozwala również przekazać parametr.