0

私は Laravel の素晴らしい世界に入りました。現在、テスト用に偽のデータをデータベースにシードすることを検討しています。

操作したいテーブルがいくつかあります。プロジェクトストーリー

stories テーブルには列があります。idname、およびproject_id (projects テーブルの fk です)。

私のプロジェクト テーブルには、10 個のプロジェクトのリストが既に入力されています。ここで、ランダムなプロジェクトが関連付けられた 100 のストーリーを作成する必要があります。私は以下のアプローチを持っています。

public function run()
{
    DB::table('stories')->delete();
    DB::statement('ALTER TABLE stories AUTO_INCREMENT = 1');

    $faker = Faker::create();

    foreach(range(1, 100) as $index)
    {
        Story::create([
            'reference' => $faker->numberBetween(1, 9999),
            'name' => $faker->sentence(6),
            'project_id' => Project::orderBy(\DB::raw('RAND()'))->get()->first()->pluck('id')
        ]);
    }
}

これが私が必要とすることを行うための最良の方法であるかどうかはわかりません。ただし、このコードを実行すると、すべてのストーリーの project_id が 1 に設定されます。最初のプロジェクトの ID。

次のコマンドをtinkerで実行すると... IDとして常に1が返されます。

Project::orderBy(\DB::raw('RAND()'))->get()->first()->pluck('id')

しかし、ティンカーで次のコマンドを実行すると...

Project::orderBy(\DB::raw('RAND()'))->get()->first()

毎回ランダムなプロジェクトを返します。これは奇妙です。->pluck() までのすべてが機能している場合、pluck() は収集されたアイテム ID をフェッチする必要があるためです...そうですか? これは、上記のコマンドが返すものです。

<App\Project #000000000c385908000000000de30942> {
   id: 6,
   name: "New Bernadetteton",
   cover_photo_url: "/uploads/covers/horizon-grass.png",
   created_at: "2015-07-08 16:32:15",
   updated_at: "2015-07-08 16:32:15" }

以下のターミナル ウィンドウのスクリーンショットを参照して、私の意味を説明してください。

ここに画像の説明を入力

4

1 に答える 1

4

何が起こっているかは次のとおりです。

  1. ->first()実際のプロジェクトモデルを取得すると

  2. それからあなたはそれを呼びますpluck('id')。しかし、Modelクラスにはそのメソッドがありません。

  3. Modelそのため、が知らないすべてのメソッドと同様に、呼び出しをモデルの新しいクエリ ビルダー インスタンスにリダイレクトします。

  4. 最終的に、その呼び出しは次のようになります。

Illuminate\Database\Eloquent\Builder@value

public function value($column)
{
    $result = $this->first(array($column));

    if ($result) return $result->{$column};
}

ご覧のとおり、そのメソッドは新しいクエリを実行しfirst()、目的の行を使用して返します。


実際に必要なのは次のいずれかです。

pluck1. 絶対に使わない

そのメソッドを使用する必要は実際にはありません。モデル プロパティにアクセスするだけです。

'project_id' => Project::orderBy(\DB::raw('RAND()'))->first()->id

2. を使用するpluckが、正しく行う

'project_id' => Project::orderBy(\DB::raw('RAND()'))->pluck('id')

ところで、メインのメソッドは と呼ばれvalue()ます。pluck()単なるエイリアスです。value()新しいコードで使用することをお勧めします。エイリアスがいつか削除される可能性があります。(明らかに、新しいリリースで、アップグレードガイドにメモがあるので、パニックにならないでください;))

于 2015-07-08T20:30:33.870 に答える