Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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! :)

like image 496
Simon Suh Avatar asked May 21 '17 22:05

Simon Suh


3 Answers

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.

like image 80
ayip Avatar answered Nov 17 '22 09:11

ayip


Any class that extends Illuminate\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 using User::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

like image 11
Henk Poley Avatar answered Nov 17 '22 08:11

Henk Poley


It does not work like that 'user_id':

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

But that's how it works:

User::all()->random()->id
like image 4
Nelson Aguiar Avatar answered Nov 17 '22 08:11

Nelson Aguiar