web-dev-qa-db-fra.com

Dans Laravel, comment puis-je récupérer un user_id aléatoire dans la table Users pour la génération de données d'amorçage Model Factory?

Actuellement, dans mon ModelFactory.php, j'ai:

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

Je voudrais générer un user_id aléatoire à partir de l'un des ID utilisateur déjà stockés dans la table des utilisateurs. Je suis perplexe parce que je ne sais pas comment afficher la sortie de données pour coder correctement, et je me demandais comment je pourrais permettre à Laravel de choisir un ID utilisateur aléatoire et de l'insérer dans la base de données. Merci! :)

13
Simon Suh

Essayez ce qui suit.

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()->user_id,
    'body' => $faker->paragraph
  ];
});

N'oubliez pas que cela récupère toutes les données utilisateur de votre table, puis choisit un identifiant au hasard. Donc, si votre table contient une énorme quantité de données, ce n'est pas recommandé. Au lieu de cela, dans votre scénario de test, vous pouvez créer un nouvel utilisateur (via sa propre fabrique) et affecter l'ID à l'objet Répondre généré à partir de la fabrique ci-dessus.

Alternativement, vous pouvez interroger un utilisateur spécifique dans la définition d'usine ci-dessus.

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

Si vous avez un utilisateur de test configuré dans votre base de données, cela évitera d'extraire toutes les données utilisateur.

24
ayip

Toute classe qui étend Illuminate\Database\Eloquent\Model Pourra faire ceci:

User::inRandomOrder()->first()

Ou pour obtenir une collection de 3 articles:

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

Cela pourrait être plus efficace que d'utiliser User::all()->first(), qui devrait d'abord interroger tous les utilisateurs.

Votre IDE (comme PhpStorm) sera probablement très confus que c'est une option.

Voir aussi: Laravel - Ligne aléatoire éloquente ou courante

0
Henk Poley

Cela ne fonctionne pas comme ça 'user_id':

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

Mais c'est comme ça que ça marche:

User::all()->random()->id
0
Nelson Aguiar