Reputation: 1187
I have a users
table with a field of parent_id
and I want to seed, but my problem is I want the parent_id
column have a value that based on the same table users
. I want the parent_id
based on the role = 3
from my users
table How could I achieve this? The users and students table are the same. It only matters in roles
column.
Table Structure
+-------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(191) | NO | | NULL | |
| fname | varchar(191) | NO | | | |
| lname | varchar(191) | NO | | | |
| email | varchar(191) | NO | UNI | NULL | |
| password | varchar(191) | NO | | NULL | |
| role | int(11) | NO | | 0 | |
| school_id | int(11) | NO | | NULL | |
| student_school_id | varchar(191) | YES | | NULL | |
| student_card_no | varchar(191) | YES | | NULL | |
| section_id | int(11) | YES | | NULL | |
| parent_id | int(11) | NO | | 0 | |
| gender | int(11) | NO | | 1 | |
| birthdate | date | YES | | NULL | |
| address | varchar(191) | NO | | | |
+-------------------+------------------+------+-----+---------+----------------+
my seeder
$faker = \Faker\Factory::create();
$numberOfStudents = $faker->numberBetween(0, 5);
for($i = 0; $i < $numberOfStudents; $i++)
{
User::firstOrCreate([
'name' => $faker->name,
'student_school_id' => $faker->unique()->numberBetween(1, 1000),
'student_card_no' => $faker->unique()->numberBetween(1, 1000),
'email' => $faker->email,
'parent_id' => // I want the expression (random user_id where role = 3)
'password' => bcrypt('ggness'),
'school_id' => 1,
'role' => 4,
'confirmed' => 1
]);
}
Upvotes: 1
Views: 1551
Reputation: 3972
Get a list of all parents' ids, then pick a random one from that list for every student:
//an array of all parents' ids
$parent_ids=User::where('role',3)->pluck('id');
$faker = \Faker\Factory::create();
$numberOfStudents = $faker->numberBetween(0, 5);
for($i = 0; $i < $numberOfStudents; $i++)
{
User::firstOrCreate([
'name' => $faker->name,
'student_school_id' => $faker->unique()->numberBetween(1, 1000),
'student_card_no' => $faker->unique()->numberBetween(1, 1000),
'email' => $faker->email,
'parent_id' => $faker->randomElement($parent_ids),
'password' => bcrypt('ggness'),
'school_id' => 1,
'role' => 4,
'confirmed' => 1
]);
}
Upvotes: 1