【问题标题】:Laravel 5.8 seeding database with many to many relations具有多对多关系的 Laravel 5.8 种子数据库
【发布时间】:2019-08-31 10:33:18
【问题描述】:

我目前使用 Laravel 5.8,我的数据库有一个 users 表和一个 roles 表,它们通过多对多关系连接。我的意图是使用php artisan migrate:fresh --seed 一次性为整个数据库播种,但是数据透视表role_user 始终为空,这表明附加/同步有问题。我打算实施更多的多对多关系,所以我想彻底了解使用播种机和工厂播种这些关系。

如何播种多对多关系并快速检查这些关系是否正常工作?

用户模型:

    class User extends Authenticatable
    {
        //Default variables generated by Laravel
        public function roles()
        {
           return $this->belongsToMany('App\Role', 'role_user')->withTimestamps();
        }
    }

角色模型:

class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany('App\User', 'role_user')->withTimestamps();
    }
}

表角色_用户迁移:

  public function up()
    {
        Schema::create('role_user', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('role_id');
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
            $table->timestamps();
    }

角色播种者:

public function run()
{
    $role_user = new Role();
    $role_user->role = 'user';
    $role_user->save();

    $role_admin = new Role();
    $role_admin->role = 'admin';
    $role_admin->save();
}

用户播种者:

 public function run()
    {
        $faker = Faker\Factory::create();

        $role_user = Role::where('role','=','user')->first();
        $role_admin  = Role::where('role','=','admin')->first();

        //Generic user account for testing
        $test_user = new User();
        $test_user->username = 'user';
        $test_user->email = 'user@example.com';
        $test_user->email_verified_at = now();
        $test_user->password = 'user';
        $test_user->remember_token = Str::random(10);
        $test_user->save();
        $test_user->roles()->attach($role_user);

        //Generic admin account for testing
        $test_admin = new User();
        $test_admin->username = 'admin';
        $test_admin->email = 'admin@example.com';
        $test_admin->email_verified_at = now();
        $test_admin->password = 'admin';
        $test_admin->remember_token = Str::random(10);
        $test_admin->save();
        $test_admin->roles()->attach($role_admin);
    }

【问题讨论】:

  • $faker 是干什么用的?对我来说它看起来很好......
  • 我只是删掉了一些行以保持代码简洁。 :)

标签: php laravel eloquent laravel-5.8


【解决方案1】:

如果你想通过工厂使用,

在工厂文件夹中创建 UserFactory.php

<?php

use App\User;
use Illuminate\Support\Str;
use Faker\Generator as Faker;

/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'username'           => $faker->name , 
        'email'              => $faker->unique()->safeEmail , 
        'email_verified_at ' => Str::random(10),
        'remember_token'     => now(),
        'password'           => Hash::make('123456')
    ];
});

然后创建 RoleUsersFactory.php

<?php

use App\User,App\Role,App\RoleUser;
use Illuminate\Support\Str;
use Faker\Generator as Faker;

/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/

$factory->define(App\RoleUser::class, function (Faker $faker) {
    return [
        'role_id'   => Role::all()->random()->id,
        'user_id'   => User::all()->random()->id,
    ];
});

然后在你的 DatabaseSeeder.php 添加这个

factory(App\User::class, 50)->create()->each(function($u) {
    $u->userroles()->save(factory(App\RoleUser::class)->make());
 });

您还需要创建 RoleUser 模型,并且在 User 模型中您设置了不正确的关系 role_user 在您的角色表中不存在。

希望对你有帮助

【讨论】:

  • 此模型必须扩展模型或枢轴?
  • 简单扩展模型
  • 我不明白关于不正确关系role_user 的那部分。我认为第二个参数用于命名数据​​透视表。在文档role_user 中,两个单数都是数据透视表的命名约定。你能给我解释一下吗?
  • 看看这个语法return $this-&gt;hasMany('App\Comment', 'foreign_key', 'local_key');参考:laravel.com/docs/5.8/eloquent-relationships#one-to-many-inverse
  • 1 个问题:Laravel 播种 100 行而不是 50 行。2 个问题:它播种的 role_ids 高于 2 并且它不起作用:'role_id' =&gt; Role::where('id','&lt;=','2')-&gt;get()-&gt;random()-&gt;id。 3 问题:它的种子不是唯一的 user_ids。
猜你喜欢
  • 2019-11-17
  • 2019-02-13
  • 2021-07-06
  • 2020-05-13
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 2011-05-03
相关资源
最近更新 更多