2015-09-12 13 views
7

Ich versuche, eine Beziehung zu einem Fabrikmodell fügen Sie einige Datenbank Aussaat zu tun, wie folgt - man beachte ich versuche 2 BeiträgeHinzufügen von Beziehungen zu Laravel Factory-Modell

public function run() 
{ 
    factory(App\User::class, 50)->create()->each(function($u) { 
     $u->posts()->save(factory(App\Post::class, 2)->make()); 
    }); 
} 

Aber sein für jeden Benutzer hinzufügen den folgenden Fehler werfen

Ich denke, es ist etwas mit dem Speichern einer Sammlung zu tun. Wenn Sie den Code neu schreiben, indem Sie jedes Fabrikmodell für den Post separat aufrufen, scheint es zu funktionieren. Offensichtlich ist das nicht sehr elegant, denn wenn ich 10 persistieren oder jedem Benutzer posten möchte, muss ich 10 oder Zeilen dekalieren, es sei denn, ich verwende irgendeine Art von for-Schleife.

public function run() 
{ 
    factory(App\User::class, 50)->create()->each(function($u) { 
    $u->posts()->save(factory(App\Post::class)->make()); 
    $u->posts()->save(factory(App\Post::class)->make()); 
    }); 
} 

* UPDATED *

Gibt es eine Möglichkeit zu nisten die Modellfabrik eine dritte Ebene tief?

public function run() 
{ 
    factory(App\User::class, 50) 
     ->create() 
     ->each(function($u) { 
      $u->posts()->saveMany(factory(App\Post::class, 2) 
        ->make() 
        ->each(function($p){ 
          $p->comments()->save(factory(App\Comment::class)->make()); 
      })); 
    }); 
} 
+4

Modelle eine saveMany() Methode, die Sammlung Objekte akzeptiert. Versuchen Sie '$ u-> posts() -> saveMany (Fabrik (App \ Post :: class, 2) -> make());'. Beachten Sie jedoch, dass dies im Hintergrund immer noch 2 Speicherabfragen generiert, die jedoch nicht mit einer Abfrage fortgeführt werden. –

+4

@Yasen: Die saveMany() -Methode funktioniert. Gibt es eine Möglichkeit, die Modellfabrik um eine dritte Ebene tiefer zu verschachteln? Siehe aktualisierten Beitrag, was ich meine. – adam78

+1

Haben Sie eine Lösung gefunden, die aus mehr als zwei Ebenen besteht? –

Antwort

4

Versuchen Sie dies. Er arbeitete für mich:

factory(\App\Models\Auth\User::class, 300)->create()->each(function ($s) { 
        $s->spots()->saveMany(factory(\App\Models\Spots\Parking::class, 2)->create()->each(function ($u) { 
          $u->pricing()->save(factory(\App\Models\Payment\Pricing::class)->make()); 
        })); 
        $s->info()->save(factory(\App\Models\User\Data::class)->make()); 
      }); 
+0

Wie würden Sie Daten weitergeben? Wie die IDs, die übereinstimmen müssen? Danke – Notflip

+1

Es ist eine Fabrik, beachten Sie die Schleifen. Alles in einer Schleife wird mit dem Modell verknüpft. –

0

Für eine dritte verschachtelte Beziehungsebene, wenn Sie die Daten mit dem richtigen entsprechenden Fremdschlüssel erstellen mögen, können Sie eine Schleife durch alle Ergebnisse aus den Pfosten zu schaffen, etwa so:

factory(App\User::class, 50)->create()->each(function($u) { 
    $u->posts() 
     ->saveMany(factory(App\Post::class, 2)->make()) 
     ->each(function($p){ 
      $p->comments()->save(factory(App\Comment::class)->make()); 
     }); 
}); 
0

Versuchen Sie, diese

public function run() 
{ 
    factory(App\User::class, 50)->create()->each(function($u) { 
     $u->posts()->save(factory(App\Post::class, 2)->create()); 
    }); 
} 
+0

Hast du es überprüft? Funktioniert es? –

Verwandte Themen