2013-06-03 9 views
16

Ich habe gerade eine neue Website gestartet und ich wollte Eloquent verwenden. Bei der Seeding meiner Datenbank bemerkte ich, dass ich leere Zeilen hinzufügen würde, wenn ich irgendeine Art von Konstruktor in das Modell aufgenommen hätte, das eloquent erweitert. Zum Beispiel diese Sämaschine ausgeführt wird:Konstruktoren auf Klassen erweitern 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' 
      ) 
     ); 
    } 

} 

Mit diesem als meine Team-Klasse:

<?php 

class Team extends Eloquent { 

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

    public function Team(){ 
     // null 
    } 
} 

ergibt dies:

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 

einfach den Konstruktor Entfernen alle zusammen ermöglicht die Seeder als arbeiten erwartet. Was genau mache ich falsch mit dem Konstruktor?

+0

Weil Eloquent seinen eigenen Konstruktor hat und was Sie tun, verunsichern Sie die ganze Handlung, die eloquent arbeiten muss. – crynobone

Antwort

25

Sie haben parent::__construct zu rufen, um die Dinge hier funktionieren, wenn man sich den Konstruktor der Eloquent Klasse aussehen:

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

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

    $this->fill($attributes); 
} 

Die boot Methode aufgerufen wird und die booted Eigenschaft festgelegt ist. Ich weiß nicht wirklich, was das tut, aber abhängig von Ihrem Problem scheint es relevant: P

Refactor Ihr Konstruktor, um das attributes Array zu erhalten und es zum übergeordneten Konstruktor setzen.

aktualisiert

Hier ist der benötigte Code:

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

+1 Für das Update, aber -1 für den ersten Code. Ursache: Wiederverwendbarkeit ... wenn das eloquente '__construct()' sich ändert, wird es inkompatibel sein – Ifnot

+0

Wenn Sie meine Antwort richtig lesen, werden Sie sehen, dass ich den eloquenten Konstruktor zur Demonstration kopiert habe :) –

+0

Oh verdammt, ja, Sie haben Recht . Ende der Zeile Erklärung und Update erwähnt mich verwirrt. Der erste Code in den Antworten ist in der Regel eine schnelle Antwort. Vielleicht sollten Sie es durch github Link ersetzen (wie ich es in der Bearbeitung getan habe). – Ifnot

1

In Laravel 3 den zweiten Parameter setzen musst 'existiert $' mit Standardwert "false".

class Model extends Eloquent { 

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

Sie können diese generische Methode verwenden, mit der Sie auch einen Parameter übergeben können.