Search code examples
phplaravellaravel-seeding

Problem with seeding users and their profiles in Laravel


I have user seeder and user profile seeder. Currently when I seed my database I get one hundred and fifty users in users table and just four users with their profiles filled in user_profiles table. Now, I know that the problem is in getUsers() function in UserProfileSeeder.php that returns json_decode result with just four users. I need help on how to write 'for' loop for that fourth user (normaluser3) so that I get correct number of results (150) in my user_profiles table? Any help is appreciated. Here is my code.

UserSeeeder.php

<?php

use App\User;
use App\Gender;
use Carbon\Carbon;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class UserSeeder extends Seeder
{
    /**
    * Run the database seeds.
    *
    * @return void
    */
    public function run()
    {
        $genders = DB::table('genders')->insert([
            [
                'genders' => 'Woman',
            ],
            [
                'genders' => 'Woman Looking For Woman',
            ],
            [
                'genders' => 'Man',
            ]
        ]);

        $genderIds = Gender::pluck('id');

        DB::table('users')->insert([
            'gender_id' => $genderIds->random(),
            'name' => 'authuser',
            'email' => '[email protected]',
            'email_verified_at' => now(),
            'password' => Hash::make('auth123456'),
            'age' => 18,
            'premium' => rand(0, 1),
            'remember_token' => Str::random(10), 
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now(),
        ]); 

        DB::table('users')->insert([
            'gender_id' => $genderIds->random(),
            'name' => 'normaluser',
            'email' => '[email protected]',
            'email_verified_at' => now(),
            'password' => Hash::make('normal123456'),
            'age' => 18,
            'premium' => rand(0, 1),
            'remember_token' => Str::random(10), 
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now(),
        ]);

        DB::table('users')->insert([
            'gender_id' => $genderIds->random(),
            'name' => 'normaluser2',
            'email' => '[email protected]',
            'email_verified_at' => now(),
            'password' => Hash::make('normal2123456'),
            'age' => 18,
            'premium' => rand(0, 1),
            'remember_token' => Str::random(10), 
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now(),
        ]);

        $faker = Faker\Factory::create();
        for ($i = 0, $n = 150; $i < $n; $i++) {
            DB::table('users')->insert([
                [
                    'gender_id' => $genderIds->random(),
                    'name' => 'normaluser3',
                    'email' => $faker->unique()->safeEmail,
                    'email_verified_at' => now(),
                    'password' => Str::random(12),
                    'age' => 18,
                    'premium' => rand(0, 1),
                    'remember_token' => Str::random(10), 
                    'created_at' => Carbon::now(),
                    'updated_at' => Carbon::now(),
                ]
            ]);
        }
    }
}

UserProfileSeeder.php

<?php

use App\User;
use Carbon\Carbon;
use Faker\Provider\Address;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class UserProfileSeeder extends Seeder
{
    /**
    * Run the database seeds.
    *
    * @return void
    */
    public function run()
    {
        $faker = Faker\Factory::create();
        foreach ($this->getUsers() as $userObject) {
            $user = User::all()->random()->id;
            $profile = DB::table('user_profiles')->insertGetId([
                'user_id' => $user,
                'status' => $faker->numberBetween($min = 1, $max = 2),
                'first_name' => $faker->firstName(),
                'last_name' => $faker->lastName(),
                'job' => $faker->company,
                'distance' => $faker->numberBetween($min = 1, $max = 1000),
                'city' => $faker->city,
                'interested_in' => $faker->numberBetween($min = 1, $max = 2),
                'age_from_preference' => $faker->numberBetween($min = 18, $max = 35),
                'age_to_preference' => $faker->numberBetween($min = 36, $max = 66),
                'looking_for' => $faker->numberBetween($min = 1, $max = 5),
                'personal_quote' => $faker->text(),
                'bio_about' => $faker->text(),
                'postal_code' => Address::postcode(),
                'country' => $faker->country,
                'height' => $faker->numberBetween($min = 140, $max = 220),
                'orientation' => $faker->numberBetween($min = 1, $max = 3),
                'sexual_preferences' => $faker->numberBetween($min = 1, $max = 4),
                'body_type' => $faker->numberBetween($min = 1, $max = 4),
                'relationship_status' => $faker->numberBetween($min = 1, $max = 5),
                'children' => $faker->numberBetween($min = 1, $max = 5),
                'smoke' => $faker->numberBetween($min = 1, $max = 3),
                'education' => $faker->numberBetween($min = 1, $max = 4),
                'astro' => $faker->numberBetween($min = 1, $max = 12),
                'hobbies' => $faker->sentence(),
                'workplace' => $faker->jobTitle,
                'sports' => $faker->numberBetween($min = 1, $max = 12),
                'movies_series' => $faker->numberBetween($min = 1, $max = 12),
                'music' => $faker->numberBetween($min = 1, $max = 12),
                'food' => $faker->numberBetween($min = 1, $max = 12),
                'literature' => $faker->numberBetween($min = 1, $max = 12),
                'mobile_number' => $faker->phoneNumber,
                'updated_at' =>  Carbon::now(),
            ]);
        }
    }

    public function getUsers()
    {
        $jsonData = '[
        {
            "name":"authuser"
        },
        {
            "name":"normaluser"
        },
        {
            "name":"normaluser2"
        },
        {
            "name":"normaluser3" // here is that user that is supposed to be in for loop!!!!!!!!!!!!!
        }
    ]';
        return json_decode($jsonData);
    }
}

Solution

  • Replace getUsers() with User:all() to iterate over every user in the database:

    foreach (User::all() as $user) {
        DB::table('user_profiles')->insert([
            'user_id' => $user->id,
            // the rest of your attributes
        ]);
    
        // if you have a relationship for the profile on your user model
        // this way you can omit the user_id, created_at and updated_at attributes
        $user->profile()->create([
            // the rest of your attributes
        ]);
    }