【问题标题】:How to add Relationship of Factories to faker in Laravel如何在 Laravel 中将工厂关系添加到 faker
【发布时间】:2018-05-01 07:14:13
【问题描述】:

我有这样的模型:

Entity - entities table
Address - address table
User - users table
Geoloc - geoloc table
UserEntity - entity_user table

现在 Entity 可以有一个地址和一个 geoloc,但它可以有多个用户,这就是 UserEntity 的用途。

所以我需要做一个模式,工厂会像这样创建它:

用户>实体>地址>Geoloc>用户实体

因此,当用户创建时,它还将创建实体、地址和 geoloc,将实体 id 关联到地址,将 geoloc id 关联到实体并将 user_id 和 entity_id 插入用户实体。

这是我目前的设置:

地址工厂:

$factory->define(App\Address::class, function (Faker $faker) {
    return [
        'building_name' => $faker->company,
        'address' => $faker->streetAddress,
        'town' => $faker->city,
        'postcode' => $faker->postcode,
        'telephone' => $faker->phoneNumber,
        'private' => $faker->boolean($chanceOfGettingTrue = 50),
        'entity_id' => function () {
            return factory(App\Entity::class)->create()->id;
        }
    ];
});

实体工厂:

factory->define(App\Entity::class, function (Faker $faker) {
    return [
        'name' => $faker->unique()->company,
        'type' => 'Service',
        'tags' => 'mens clothes, online shopping, ladies clothes',
        'email' => $faker->safeEmail,
        'logo' => $faker->imageUrl($width = 640, $height = 480),
        'cover' => $faker->imageUrl($width = 1000, $height = 600),
        'bio' => $faker->catchPhrase,
        'main' => $faker->realText($maxNbChars = 200, $indexSize = 2),
        'twitter_business' => 'OfficialOAFC',
        'facebook_business' => 'MolinoLounge',
        'instagram_business' => 'OfficialOAFC',
        'google_places' => 'ChIJvaCBHYG3e0gRfhs0xZ1TBB8',
        'eventbrite' =>'8252340832',
        'featured' => $faker->boolean($chanceOfGettingTrue = 50),
        'url' => $faker->url,
        'video' => '6R2DIFySho4',
        'wikipedia' => 'Hackerspace',
        'contact_name' => $faker->name,
        'contact_number' => $faker->phoneNumber,
        'geoloc_id' => function () {
            return factory(App\Geoloc::class)->create()->id;
        }
    ];
});

用户工厂:

$factory->define(App\User::class, function (Faker $faker) {
    static $password;
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'),
        'avatar' => $faker->imageUrl($width = 640, $height = 480),
        //'telephone' => $faker->phoneNumber,
        'role' => rand(1, 2),
        'remember_token' => str_random(10),
    ];
});

数据库播种器:

    factory(App\User::class, 30)->create();
    factory(App\Address::class, 30)->create();

用户关系:

public function entities()
{
    return $this->belongsToMany('App\Entity', 'entity_user', 'user_id', 'entity_id');
}

实体关系:

public function address()
{
    return $this->hasOne('App\Address', 'entity_id');
}
public function _geoloc()
{
    return $this->belongsTo('App\Geoloc', 'geoloc_id', 'id');
}

【问题讨论】:

  • users 表与entities 表有什么关系?
  • @Camilo 使用联结表 entity_user 关联
  • User 模型与Entity 模型有什么关系?显示关系定义。
  • 公共函数实体() { return $this->belongsToMany('App\Entity', 'entity_user', 'user_id', 'entity_id'); }
  • 将其添加到问题中,它也可能对其他人有所帮助。

标签: laravel laravel-5 laravel-5.5 faker


【解决方案1】:

我认为您可以在播种机中实现这一点,例如:

factory(App\User::class, 30)->create()->each(function($user) {

    $entity = factory(App\Entity::class)->make();

    $address = factory(App\Address::class)->create([
        'entity_id' => $entity
    ]);

    $user->entities()->save($entity);
});

如果您要为每个用户创建多个实体,则需要使用saveMany() 而不是save()

【讨论】:

  • 同样的问题如下:那我还需要修改工厂本身吗?因为例如 address 正在创建一个新实体并将其 entity_id 添加到它
  • 您可以使用来自Address 工厂的相同实体,但您需要查询它。我认为这样更简单。
  • 好吧 1 个简单的问题,顺便说一句。 $user->entities()->save($entity) 有什么作用?我知道它从 $entity 获取 entity_id 但 entity_user 如何也有正确的 user_id?
  • 那将是一个单独的问题,它不是一个简短的答案。如果我的回答解决了你的问题,请考虑采纳。
【解决方案2】:

你应该在播种机上这样做。

例如:

public function run()
{
    factory(App\Currency::class, 100)->create()->each(function ($currency) {
        $currency->variations()->saveMany(factory(App\Variation::class, 50)->make());
    });
}

【讨论】:

  • 那我还需要修改工厂本身吗?因为例如 address 正在创建一个新实体并将其 entity_id 添加到它
  • 抱歉,您的设置有什么问题?
猜你喜欢
  • 2021-06-29
  • 1970-01-01
  • 2015-12-09
  • 2021-08-15
  • 2020-03-09
  • 2016-08-18
  • 2019-04-01
  • 2020-04-04
  • 2012-12-07
相关资源
最近更新 更多