我有两个模型需要在创建数据后关联。我已经问过了here https://stackoverflow.com/questions/58742894/how-to-associate-data-from-a-different-factory并得到了答案。我实现了它并做了一些修改,因为它没有正确关联数据。现在我对协会有疑问。它仅与最后的数据相关联。
我期望的是从工厂创建的所有数据都是相互关联的。
当我做php artisan tinker
并运行App\App::first()->load('menus', 'menus.page')
命令,它没有给我正确的数据。请看一下结果here https://pastebin.com/ri9MbFuN.
正如您所看到的,正确的数据仅显示在最后一个对象上。剩下的就是null
。我怎样才能解决这个问题?请看一下下面我的种子文件,我是否犯了任何错误?
<?php
use App\App;
use App\Component;
use App\Menu;
use App\Page;
use App\Role;
use App\Submenu;
use App\User;
use Illuminate\Database\Seeder;
class UsersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$superadmin = Role::whereName('superadmin')->first();
$tester = new User();
$tester->name = "Tester";
$tester->email = "[email protected] /cdn-cgi/l/email-protection";
$tester->password = bcrypt('password');
$tester->save();
$tester->roles()->attach($superadmin);
// Create 5 apps for each user
$tester->apps()->saveMany(factory(App::class, 5)->make())->each(function ($app) {
$menus = factory(Menu::class, 5)->make();
$pages = factory(Page::class, 5)->make();
// Create 5 menus for each app and 5 submenus for each menu
$app->menus()->saveMany($menus)->each(function ($menu) use ($pages) {
// Associate page with each menu
$pages->each(function ($page) use ($menu) {
$page->menu()->associate($menu);
});
// Create 5 submenus for each menu
$menu->submenus()->saveMany(factory(Submenu::class, 5)->make())->each(function ($submenu) use ($pages) {
// Associate page with each submenu
$pages->each(function ($page) use ($submenu) {
$page->submenu()->associate($submenu);
});
});
});
// Create 5 pages for each app and 5 components for each page
$app->pages()->saveMany($pages)->each(function ($page) {
$page->components()->saveMany(factory(Component::class, 5)->make());
});
});
}
}
Update
这是我的模型文件,请看一下:
App.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class App extends Model
{
/**
* The attributes that should not be mass assignable.
*
* @var array
*/
protected $guarded = ['id'];
/**
* Each app belongs to a user.
*
* @return \Illuminate\Database\Eloquent\Relationship\BelongsTo
*/
public function user()
{
return $this->belongsTo(User::class);
}
/**
* Each app has many pages.
*
* @return \Illuminate\Database\Eloquent\Relationship\HasMany
*/
public function pages()
{
return $this->hasMany(Page::class);
}
/**
* Each app has many menus.
*
* @return \Illuminate\Database\Eloquent\Relationship\HasMany
*/
public function menus()
{
return $this->hasMany(Menu::class);
}
}
Menu.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Menu extends Model
{
/**
* The attributes that should not be mass assignable.
*
* @var array
*/
protected $guarded = ['id'];
/**
* Each menu belongs to a app.
*
* @return \Illuminate\Database\Eloquent\Relationship\BelongsTo
*/
public function app()
{
return $this->belongsTo(App::class);
}
/**
* Each menu has one page.
*
* @return \Illuminate\Database\Eloquent\Relationship\HasOne
*/
public function page()
{
return $this->hasOne(Page::class);
}
/**
* Each menu has many submenus.
*
* @return \Illuminate\Database\Eloquent\Relationship\HasMany
*/
public function submenus()
{
return $this->hasMany(Submenu::class);
}
/**
* Each menu belongs to many roles.
*
* @return \Illuminate\Database\Eloquent\Relationship\BelongsToMany
*/
public function roles()
{
return $this->belongsToMany(Role::class);
}
}
Page.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Page extends Model
{
/**
* The attributes that should not be mass assignable.
*
* @var array
*/
protected $guarded = ['id'];
/**
* Each page belongs to an app.
*
* @return \Illuminate\Database\Eloquent\Relationship\BelongsTo
*/
public function app()
{
return $this->belongsTo(App::class);
}
/**
* Each page has many components.
*
* @return \Illuminate\Database\Eloquent\Relationship\HasMany
*/
public function components()
{
return $this->hasMany(Component::class);
}
/**
* Each page belongs to a menu.
*
* @return \Illuminate\Database\Eloquent\Relationship\BelongsTo
*/
public function menu()
{
return $this->belongsTo(Menu::class);
}
/**
* Each page belongs to a submenu.
*
* @return \Illuminate\Database\Eloquent\Relationship\BelongsTo
*/
public function submenu()
{
return $this->belongsTo(Submenu::class);
}
}