2016-08-03 111 views
0

Ich versuche, meine erste polymorphe Beziehung zu erstellen und haben die Dokumentation auf der Website gefolgt und überprüft mit mehreren Online-Tutorials, die alle einem ähnlichen Thema folgen. Ich habe 3 Tabellen, Seiten, Menü und Menüpunkte. Menüelemente sind immer ein untergeordnetes Element von Menu und sind entweder eine Seite (im Falle eines Links) oder ein anderes Menü (im Falle eines Untermenüs). Meine Tabellen sind:Laravel polymorphe Relation Abfrage auf der Suche nach der falschen Spalte

Seiten

+----+------+----------+------+--------+-----------+-----------------+------------+------------+------------+ 
| id | name | url_slug | file | layout | seo_title | seo_description | created_at | updated_at | deleted_at | 
+----+------+----------+------+--------+-----------+-----------------+------------+------------+------------+ 

Menüs

+----+------+------------+------------+ 
| id | name | created_at | updated_at | 
+----+------+------------+------------+ 

Menüpunkte

+----+---------+-------------+---------------+-------+------+-------+------------+------------+ 
| id | menu_id | itemable_id | itemable_type | label | left | right | created_at | updated_at | 
+----+---------+-------------+---------------+-------+------+-------+------------+------------+ 

So zum Menü ite ms Tabelle Die menu_id ist das übergeordnete Element des Menüelements. Es hat eine Eins-zu-viele-Beziehung mit der Menütabelle. itemable_id und itemable_type werden in der polymophischen Beziehung verwendet, itemable_id sollte die id Spalte entweder in Menüs oder Seiten verweisen, je nachdem, was itemable_type ist, die das Menü oder Page-Modell sein wird.

diese Beziehung erstellen Ich Methoden meiner Modelle wie diese hinzugefügt haben:

Seite

/** 
* Fetch the menu items this page is linked to. 
* 
* @return \Illuminate\Database\Eloquent\Relations\MorphMany 
*/ 
public function menuItems() 
{ 
    return $this->morphMany('App\Modules\Menu\Models\MenuItem', 'itemable'); 
} 

Menü

/** 
* Fetch all child menu items belonging to this menu. 
* 
* @return \Illuminate\Database\Eloquent\Relations\HasMany 
*/ 
public function childItems() 
{ 
    return $this->hasMany('App\Modules\Menu\Models\MenuItem'); 
} 

/** 
* Fetch all menu items linked to this menu. 
* 
* @return \Illuminate\Database\Eloquent\Relations\MorphMany 
*/ 
public function menuItems() 
{ 
    return $this->morphMany('App\Modules\Menu\Models\MenuItem', 'itemable'); 
} 

Menüpunkt

/** 
* Fetch the menu this item belongs to. 
* 
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo 
*/ 
public function menu() 
{ 
    return $this->belongsTo('App\Modules\Menu\Models\Menu'); 
} 

/** 
* Fetch the models this menu item links to. 
* 
* @return \Illuminate\Database\Eloquent\Relations\MorphTo 
*/ 
public function itemable() 
{ 
    return $this->morphTo(); 
} 

Ich habe alle Tabellen erstellt und ich versuche nun, sie zu säen. Mein Samen sieht wie folgt aus:

public function run() 
{ 
    $menu = Menu::create([ 
     'name' => 'Main' 
    ]); 

    foreach ([ 
        [ 
         'page_id' => 1, 
         'label' => 'Home', 
         'left' => 1, 
         'right' => 2 
        ], 
        [ 
         'page_id' => 2, 
         'label' => 'About Us', 
         'left' => 3, 
         'right' => 4 
        ] 
       ] as $arr) 
    { 
     /* @var $page Page */ 
     $page = Page::findOrFail($arr['page_id']); 
     $item = new MenuItem($arr); 
     $page->menuItems()->save($item); 
     $item->menu()->associate($menu); 
    } 
} 

Aber ich erhalte immer Fehler, wenn ich es laufen über die page_id Spalte nicht vorhanden ist. Der genaue Fehler ist

[Illuminate\Database\QueryException]                                                        
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'page_id' in 'field list' (SQL: insert into `menu_items` (`page_id`, `label`, `left`, `right`, `itemable_type`, `itemable_id`, `updated_at`, `created_at`) values (1, Home, 1, 2, App\Models\Page, 1, 2016-08-03 12:32:21, 2016-08-03 12:32:21)) 

Alles rund um die Abfrage ist in Ordnung, außer es versucht page_id sowie die itemable Spalten zu füllen. Warum macht es das? Wie kann ich es umgehen?

Antwort

2

Versuchen page_id zu itemable_id

[ 
    'page_id' => 1, //change this to itemable_id 
    'label' => 'Home', 
    'left' => 1, 
    'right' => 2 
], 
[ 
    'page_id' => 2, //change this to itemable_id 
    'label' => 'About Us', 
    'left' => 3, 
    'right' => 4 
] 

Da in folgende Zeile zu ändern,

$item = new MenuItem($arr); 

Wenn Sie die die $arr in MenuItem einzufügen versuchen, es erwartet itemable_id und nicht page_id
So Ihre Aktualisierter Code wäre wie folgt:

public function run() 
{ 
    $menu = Menu::create([ 
     'name' => 'Main' 
    ]); 

    foreach ([ 
        [ 
         'itemable_id' => 1, 
         'label' => 'Home', 
         'left' => 1, 
         'right' => 2 
        ], 
        [ 
         'itemable_id' => 2, 
         'label' => 'About Us', 
         'left' => 3, 
         'right' => 4 
        ] 
       ] as $arr) 
    { 
     /* @var $page Page */ 
     $page = Page::findOrFail($arr['itemable_id']); 
     $item = new MenuItem($arr); 
     $page->menuItems()->save($item); 
     $item->menu()->associate($menu); 
    } 
} 
+0

Doh>. <, Weil ich ein ausfüllbares Array habe ich dachte nicht, es würde page_id aus dem Array nehmen. Es kam mir gar nicht in den Sinn, dass es so sein könnte. Vielen Dank. – Styphon

0

Sie sind menu_items Spalt enthalten keine page_id Spalt und wenn Sie versuchen, Sie versuchen, neue Daten Saatgut in ein menu_items zu speichern und es wird jede Spalte überprüft aus den file_list mit Ihrer Zieltabelle, die ist hier menu_items und es enthält

Menüpunkte

+----+---------+-------------+---------------+-------+------+-------+------------+------------+ 
| id | menu_id | itemable_id | itemable_type | label | left | right | created_at | updated_at | 
+----+---------+-------------+---------------+-------+------+-------+------------+-- 

so die Spalte zu itemable_id umbenennen wie so

foreach ([ 
       [ 
        'itemable_id' => 1, 
        'label' => 'Home', 
        'left' => 1, 
        'right' => 2 
       ], 
       [ 
        'itemable_id' => 2, 
        'label' => 'About Us', 
        'left' => 3, 
        'right' => 4 
       ] 
      ] as $arr) 
{ 
    /* @var $page Page */ 
    $page = Page::findOrFail($arr['itemable_id']);