web-dev-qa-db-ja.com

Laravelで、Model Factoryシードデータ生成のためにUsersテーブルからランダムなuser_idを取得するにはどうすればよいですか?

現在、私のModelFactory.phpには、次のものが含まれています。

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

Userテーブルに既に格納されているユーザーIDの1つからランダムなuser_idを生成したいと思います。コードへのデータ出力を適切に表示する方法がわからないので困惑しており、LaravelでランダムなユーザーIDを選択して挿入できるようにするにはどうすればよいでしょうか。データベース。ありがとう!:)

13
Simon Suh

以下をお試しください。

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
  ];
});

これにより、テーブルからすべてのユーザーデータが取得され、ランダムにIDが選択されることに注意してください。したがって、テーブルに大量のデータがある場合は、お勧めしません。代わりに、テストケースで、新しいユーザーを(独自のファクトリを介して)作成し、上記のファクトリから生成されたReplyオブジェクトにIDを割り当てることができます。

または、上記のファクトリ定義で特定のユーザーを照会することもできます。

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

DBにテストユーザーを設定している場合、これによりすべてのユーザーデータの取得が回避されます。

24
ayip

_Illuminate\Database\Eloquent\Model_を拡張するクラスは、これを実行できます。

_User::inRandomOrder()->first()
_

または、3つのアイテムのコレクションを取得するには:

_User::inRandomOrder()->limit(3)->get()
_

これは、最初にすべてのユーザーを照会する必要があるUser::all()->first()を使用するよりも効率的です。

あなたのIDE(PhpStormのような)はおそらくこれがオプションであると激しく混乱するでしょう。

次も参照してください: Laravel-Eloquent or Fluent random row

0
Henk Poley

その 'user_id'のようには機能しません。

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

しかし、それはそれがどのように機能するかです:

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