2013-06-03 2 views
16

Ho appena avviato un nuovo sito Web e volevo utilizzare Eloquent. Nel processo di seeding del mio database, ho notato che avrei aggiunto le righe vuote se avessi incluso qualsiasi tipo di costruttore sul modello che si estende eloquente. Ad esempio, l'esecuzione di questa seminatrice:Costruttori su classi che estendono 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' 
      ) 
     ); 
    } 

} 

con questo come la mia classe della squadra:

<?php 

class Team extends Eloquent { 

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

    public function Team(){ 
     // null 
    } 
} 

cede questo:

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 

semplicemente rimuovendo il costruttore tutti insieme permette la seminatrice a lavorare come previsto. Cosa sto facendo di sbagliato con il costruttore?

+0

Poiché Eloquent ha il proprio costruttore e ciò che si sta facendo disinnesca tutta l'azione che eloquente ha bisogno di lavorare. – crynobone

risposta

25

devi chiamare parent::__construct a far funzionare le cose qui, se si guarda al costruttore della classe 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); 
} 

Il metodo boot viene chiamato e la proprietà booted è impostata. Non so davvero cosa stia facendo, ma a seconda del problema sembra rilevante: P

Riforma il tuo costruttore per ottenere l'array attributes e metterlo al costruttore genitore.

Aggiornamento

Ecco il codice necessario:

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

+1 Per l'aggiornamento, ma -1 per il primo codice. Causa: riusabilità ... se l'eloquente '__construct()' cambia sarà incompatibile – Ifnot

+0

Se leggi la mia risposta correttamente vedrai che ho appena copiato il costruttore Eloquent per dimostrazione :) –

+0

Oh accidenti, sì hai ragione . La spiegazione di fine riga e le menzioni di aggiornamento mi hanno confuso. Il primo codice di risposta è generalmente una risposta rapida copia/incolla. Forse dovresti sostituirlo con il link github (come ho fatto in modifica). – Ifnot

1

In laravel 3 è necessario inserire il secondo parametro '$ esiste' con valore predefinito "false".

class Model extends Eloquent { 

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

È possibile utilizzare questo metodo generico che consente di passare anche un parametro.

/** 
* 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...  
}