Семенные данные с родственными отношениями в Laravel - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь заполнить мое Laravel 5.6 приложение через фабрику фейеров, я прошел по ссылке и немного запутался, так как у меня есть некоторые базовые статические данные, как, например, у меня есть компания модель:

class Company extends Model {

    use SoftDeletes, HasDataSearchTable, HasSlug;

    protected $fillable = [
        'name', 'code_link', 'slug', 'establishment', 'parent_id', 'website', 'updates', 'user_id', 'tracked', 'verified', 'active', 'premium', 'status'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'created_at','updated_at','deleted_at'
    ];

    public function roles()
    {
        return $this->belongsToMany('Noetic\Plugins\Conxn\Models\Variables\Company\Role', 'company_role_relation', 'company_id', 'role_id')->withTimestamps();
    }
}

И реляционная роль модель:

class Role extends Model
{
    use SoftDeletes  , HasDataSearchTable;

    protected $table='company_role';

    protected $fillable = [
        'name', 'parent_id'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'created_at','updated_at','deleted_at'
    ];

}

и соответствующая база данных, я соблюдаю соглашение Laravel,Теперь я хочу заполнить данные:

У меня есть определенный набор ролей, которые я собираю вручную,

class CompanyRoleSeed extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('company_role')->insert([
            ['name' => 'Contractor', 'parent_id' => null],
            ['name' => 'Consultant', 'parent_id' => null],
            ['name' => 'Manufacturer', 'parent_id' => null],
            ['name' => 'Miscellaneous', 'parent_id' => null],
            ['name' => 'Owner', 'parent_id' => null],
            ['name' => 'Supplier', 'parent_id' => null],
        ]);

    }
}

Для компании я хочу создать фабрику, поэтому я сделал:

$factory->define(Company::class, function (Faker $faker) {


    return [
        'name' => $faker->company,
        'code_link' => rand(5, 10),
        'slug' => str_slug($faker->company),
        'about' => $faker->paragraphs(),
        'establishment' => $faker->randomElement('2015', '2016', '2017', '2018'),
        'parent_id' => $faker->randomElement(null, '1', '2', '3'),
        'website' => $faker->url,
        'user_id' => $faker->randomElement('1', '2', '3', '4', '5'),
        'updates' => $faker->paragraphs(),
        'tracked' => $faker->boolean,
        'verified' => $faker->boolean,
        'active' => $faker->boolean,
        'premium' => $faker->boolean,
        'status' => $faker->randomElement('saved', 'draft')
    ];
});

И в компании семян у меня:

class CompanySeed extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(Company::class, 10)->create()->each(function ($company) {
            $company->roles()->save(); // Don't now how to execute here
        });
    }
}

Помогите мне на месте $company->roles()->save(); Что мне делать здесь.

Любое руководство или импровизацияприветствуется.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

прежде чем ответить на ваш вопрос, вы должны знать, что документация Laravel объясняет, как сделать эту .

Но для того, чтобы сохранить связанную модель, вам сначала нужно создать поддельную иливаш случай относится к роли, которую вы уже создали .Чтобы сделать это, вы могли бы сначала создать фабрику ролей, используя что-то вроде этого:

$factory->define(App\Role::class, function (Faker $faker) {
    $randomRoleAlreadyCreated = \App\Role::all()->random();
    return [
        'name' => $randomRoleAlreadyCreated->name, 
        'parent_id' => $randomRoleAlreadyCreated->parent_id
    ];
});

Как вы можете видеть на фабрике ролей, которую я создал, я вытаскиваю случайную роль, поскольку вы заявили, что вы уже создали их вручную,так что если вы выберете одну случайно, то ваши компании будут связаны с одной из ваших ролей случайно!

После того, как у вас есть: Роли, созданные в БД, фабрика ролей, вы можете связать случайные роли скомпания, использующая фабрику для сохранения случайного экземпляра.

factory(Company::class, 10)->create()->each(function ($company) {
        $company->roles()->save(factory(App\Role::class)->make()); // Don't now how to do here
    });

Обновление Если вы хотите сохранить несколько ролей для каждой компании, вы можете сделать это:

factory(Company::class, 10)->create()->each(function ($company) {
        // Instead of 4 you could also create a random number 
        // using $numberOfRolesToAttach = rand($min,$max)
        for($i = 1; $i <= 4; $i++) :
            $company->roles()->save(factory(App\Role::class)->make());
        endfor;

    });
0 голосов
/ 31 мая 2018

Вы можете запросить, какие роли вы хотите назначить компаниям и связать их с созданными записями, например:

class CompanySeed extends Seeder
{
    public function run()
    {
        $contractorRole = Role::whereName('Contractor')->firstOrFail();
        $ownerRole = Role::whereName('Owner')->firstOrFail();

        factory(Company::class, 10)->create()->each(function ($company) use ($contractorRole, $ownerRole) {
            $company->roles()->attach([
                $contractorRole->id,
                $ownerRole->id
            ]);
        });
    }
}

Вы можете проверить документ для связанных записей https://laravel.com/docs/5.6/eloquent-relationships#inserting-and-updating-related-models

...