draw134
draw134

Reputation: 1187

laravel seeder assign a value in column based on existing data from database

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

Answers (1)

Qonvex620
Qonvex620

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

Related Questions