php - In Laravel, how do I retrieve a random user_id from the Users table for Model Factory seeding data generation?

929

Currently, in my ModelFactory.php, I have:

$factory->define(App\Reply::class, function (Faker\Generator $faker) {
  return [
    'thread_id' => 1,
    'user_id' => 1,
    'body' => $faker->paragraph
  ];
});

I would like to generate a random user_id from one of the user ID's already stored in the user table. I'm stumped because I don't know the way to display data output to code properly, and I was wondering how I would be able to allow Laravel to choose a random user ID and insert into the database. Thank you! :)

105

Answer

Solution:

Try the below.

use App\User; // Assuming this is your User Model class with namespace.

$factory->define(App\Reply::class, function (Faker\Generator $faker) {
  return [
    'thread_id' => 1,
    'user_id' => User::all()->random()->id,
    'body' => $faker->paragraph
  ];
});

Remember that this gets all the user data from your table and then choses an id randomly. So if your table has huge amount of data, it is not recommended. Instead, in your Test Case, you can create a new User (via its own factory) and assign the id to the Reply object generated from the above factory.

Alternately, you can query for a specific user in the above factory definition.

'user_id' => User::where('username', 'like', '[email protected]')->get()->random()->id

If you have a test user set up in your DB this will avoid pulling all the user data.

802

Answer

Solution:

Any class that extendsIlluminate\Database\Eloquent\Model will be able to do this:

User::inRandomOrder()->first()

Or to get a Collection of 3 items:

User::inRandomOrder()->limit(3)->get()

This might be more efficient than usingUser::all()->first(), which ought to first query all Users.

Your IDE (like PhpStorm) will probably be wildly confused that this is an option though.

Also see: Laravel - Eloquent or Fluent random row

670

Answer

Solution:

It does not work like that 'user_id':

User::all()->random()->user_id

But that's how it works:

User::all()->random()->id
43

Answer

Solution:

I personally like to use.

App\User::pluck('id')->random()

Change the model name which model you want

736

Answer

Solution:

It may not be that efficient but you can use it:

User::all('id')->random();

or

rand(1,User::count());

or

User::inRandomOrder()->limit(1)->get();

First one will be more faster thanUser::all()->random()->id; because that all function by default gets '*' as column name parameter. So, it will get all the columns for all the rows.

170

Answer

Solution:

If Anyone wants a unique User_id you can try this.

'user_id' => User::all()->unique()->random()->id,

Or either it's

'user_id' => User::all()->random()->id,

Model name can change as your wants.

People are also looking for solutions to the problem: class - PHP mysqli segmentation fault

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.