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?
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