2016-11-07 6 views
1

Ich bin derzeit mit dem folgenden festgefahren: Ich versuche, ein Catgorie System zu meiner App zu implementieren. Daher brauche ich etwa 100-200 Kategorien mit einigen "Elternkategorien". Daher möchte ich zwei Tabellen erstellen: Kategorie, Unterkategorie. Die Kategorietabelle enthält die übergeordneten Kategorien, die Unterkategorien sind deren Unterkategorien und verweisen auf den Primärschlüssel der übergeordneten Kategorie. Hier ist, was ich mit der Kategorie bedeuten:Laravel - Seed Daten für Kategorien

Geordnete Kategorie: Kleidung

Unterkategorie: Frauenschuhe

Unterkategorie: Herrenhemden

Unterkategorie: Jeans

Geordnete Kategorie: Handys

Unterkategorie: Smartphones

Unterkategorie:

Unter PDA: Smartwatches

und so weiter.

Was ich versuchte, ist dies:

$categories = array(['name' => 'Clothing'], ['name' => 'Handy']); 
     $sub_categories = array(
      'Clothing' => ['name' => ' Woman Shoes '], ['name' => 'Men\'s Shirts'], 
      'Handy' => ['name' => ' Smartphones '], ['name' => 'Smartwatches '] 
     ); 


     foreach($categories as $category) 
     { 
      $category = Category::create($category); 
     foreach ($sub_categories as $sub_category) 
     { 
      $active = $sub_category[$category->name]; 
      $active['parent_id'] = $categories->id; 
      SubCategory::create($active); 
     } 
    } 

Aber ich bin immer den Fehler (wenn Aussaat) index undefined: clothing, vermutet, es ist wegen dieses Teils: $sub_category[$category->name]; ... Aber wie kann ich es besser machen? Oder wie kann ich das funktionieren?

Ich habe auch versucht, dass (in der inneren foreach):

$subcategory = new Subcategory(); 
$subcategory->name = $sub_category['name']; 
$subcategory->parent_id = $category['id']; 
$subcategory->save(); 

Auf diese Weise gibt es keine Fehler gibt, aber alle Eltern Kategorie jede Untergruppe hat, so sehe ich nicht für die Unterkategorien Eltern.

Wie kann ich bekommen, was ich will?

Antwort

1

Ich habe dies getestet und es funktioniert gut:

$data = [ 
    'Clothing' => ['Woman Shoes', 'Men\'s Shirts'], 
    'Handy' => ['Smartphones', 'Smartwatches '] 
]; 

foreach ($data as $category => $subCategories) 
{ 
    $id = Category::create(['name' => $category])->id; 

    foreach ($subCategories as $subCategory) { 
     SubCategory::create([ 
      'parent_id' => $id, 
      'name' => $subCategory 
     ]); 
    } 
} 

Vergessen Sie nicht alle Felder $fillable hinzuzufügen, da Sie create() Methode verwenden.

+0

Okay, was ist die Antwort zu lösen? Ändern Sie die letzte Zeile in Ihren bereitgestellten Code? Gleicher Fehler, undefinierter Index ... – user5638730

+0

Ich habe meinen Code aktualisiert. Es wird für Sie arbeiten und es ist lesbarer. –

+1

Ja, das funktioniert gut. Ich benutze jetzt protected $ guarded = ['id']; als alles andere sollte Masse zuweisbar sein. – user5638730

1

Sie eine Verwendung von Laravel Beziehungen nehmen sollte ...

Hier ist die Beziehung zwischen Kategorie und Unterkategorie ist One to Many, so dass Sie eine Beziehung wie diese erstellen können.

// App\Models\Category Model 
public function sub_categories() { 
    return $this->hasMany('App\Models\SubCategory'); 
} 

// App\Models\SubCategory Model 
public function category() { 
    return $this->belongsTo('App\Models\Category'); 
} 

foreach($categories as $category_arr) { 
    $cat = Category::create($category_arr); 
    foreach($sub_categories[$category_arr['name']] as $sub_arr) { 
     $sub_cat_obj_arr[] = new SubCategory($sub_arr); 
    } 
    $cat->sub_categories()->saveMany($sub_cat_obj_arr); 
} 

Hoffnung hilft dies Ihr Problem in einem Laravel Way jetzt

+0

Wie könnte ich das in meinem Fall benutzen? Nur die gleichen Definitionen oben und dann die zwei Funktionen plus die 'foreach'? – user5638730

+0

[Symfony \ Komponente \ Debug \ Exception \ FatalThrowableError] Typ Fehler: Argument 1 an Illuminate \ Database \ Eloquent \ Relations \ HasOneOrMany :: save() übergeben muss eine Instanz Illuminate \ Database \ Eloquent \ Model, boolean gegeben werden – user5638730

+0

bekommen diesen Fehler – user5638730