I have models like this:
Entity - entities table
Address - address table
User - users table
Geoloc - geoloc table
UserEntity - entity_user table
Now Entity can have one address and one geoloc, but it can have multiple users this is what UserEntity is for.
So I need to do a pattern where factory will create it like this:
User>Entity>Address>Geoloc>UserEntity
so when user is created it will also create entity, address and geoloc, associate entity id to address, associate geoloc id to entity and insert user_id and entity_id to user entity.
Here's my current setup:
AddressFactory:
$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;
}
];
});
EntityFactory:
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;
}
];
});
UserFactory:
$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),
];
});
DatabaseSeeder:
factory(App\User::class, 30)->create();
factory(App\Address::class, 30)->create();
User relations:
public function entities()
{
return $this->belongsToMany('App\Entity', 'entity_user', 'user_id', 'entity_id');
}
Entity relations:
public function address()
{
return $this->hasOne('App\Address', 'entity_id');
}
public function _geoloc()
{
return $this->belongsTo('App\Geoloc', 'geoloc_id', 'id');
}
I think you can achieve this in your seeder like:
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);
});
If you are going to create multiple entities for each user, you will need to use saveMany() instead of save().
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With