質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

895閲覧

laravel Collectionメソッドとfactoryの組み合わせについて

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/10/28 12:21

laravelを勉強し始めて1日の初心者です。
userが1日に歩いた歩数を管理するテーブルuser_walkingsテーブルを作成し、
Factory経由でuser_walkingsテーブルにデータをいれるSeederを作成中で、
user_walkingsテーブルにはUsersテーブルのuser.idを参照するuser_idカラムを追加し、外部キー制約付きでテーブルをマイグレーションしております。
##実現したいこと
Seederを使い、usersテーブルの既存のユーザーをランダムで5人取得し、
1人につき1週間分の日付(5人×7日分なので最大35レコード)を初期データとしてデータベースに登録するためにCollection time()を使用すれば実現できるということが分かったのですが、正しい記載方法がわからないため、ご教授お願いしたいです。

イメージ説明

##collectionを使わないで実現したコード

php

1 2//UserWalkingTableSeeder.php 3<?php 4 5use App\Models\User; 6use App\Models\UserWalking; 7use Illuminate\Database\Seeder; 8 9class UserWalkingTableSeeder extends Seeder 10{ 11 /** 12 * Run the database seeds. 13 * 14 * @return void 15 */ 16 public function run() 17 { 18 $users = User::inRandomOrder()->take(5)->get(); 19 $users->each(function ($user) { 20 $walk_date = new DateTime('2021-10-31'); 21 for ($i = 0; $i < 7; $i++) { 22 factory(UserWalking::class, 1)->create([ 23 'user_id' => $user->id, 24 'walk_date' => $walk_date->modify('+1day')->format('y-m-d') 25 ]); 26 } 27 }); 28 } 29}

php

1//UserWalkingFactory.php 2<?php 3 4use App\Models\UserWalking; 5use Faker\Generator as Faker; 6 7$factory->define(UserWalking::class, function (Faker $faker) { 8 return [ 9 'user_id' => function () 10 { 11 return factory(App\Models\User::class)->create()->id; 12 }, 13 'walk_cnt' => $faker->numberBetween(10, 10000), 14 'walk_date' => '', 15 'created_at' => now(), 16 'updated_at' => now(), 17 ]; 18});

上記をfor文ではなく、Collection::times()で同じ様に実現したいのですが、調べてもよくわからず正しい書き方がわからないので、データを挿入することが出来ませんでした。皆さんの力をお借りしたいです。よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

自己解決いたしました。

collection::times()を
https://readouble.com/laravel/6.x/ja/collections.html#method-times
を参考に自分なりに記述していく中で、$userを定義できずエラー続きでしたが、
無名関数を使いことで解決しました。

投稿2021/10/29 08:00

編集2021/10/29 08:03
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問