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

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

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

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

PHP

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

Q&A

解決済

1回答

2462閲覧

laravel Seederでランダムな日付を7日分挿入したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

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

PHP

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

0グッド

0クリップ

投稿2021/10/30 05:12

laravel初心者です。
現在、ダミーデータを挿入するため、factory faker seederの勉強をしております。
親となるusersテーブルには50人のユーザーを作成し、その内5人の1日に歩いた歩数を管理するuser_walkingsテーブルを作成しました。

子となるuser_walkingsテーブルには

usersテーブルのuser_id
1日の歩数 walk_cnt
歩数を記録した日付 walk_date

上記3つのカラムがあり、歩数を記録した日付 walk_date にはランダムな日付で1人あたり7日分初期データとして挿入したいです。

php

1 2//UserWalkingTableSeeder.php 3<?php 4 5use App\Models\User; 6use App\Models\UserWalking; 7use Illuminate\Database\Seeder; 8use Illuminate\Support\Collection; 9use Carbon\Carbon; 10 11class UserWalkingTableSeeder extends Seeder 12{ 13 /** 14 * Run the database seeds. 15 * 16 * @return void 17 */ 18 public function run() 19 { 20 //usersテーブルのユーザーをランダムで5件取得 21 $users = User::inRandomOrder()->take(5)->get(); 22 $users->each(function ($user) { 23 Collection::times(7, function ($walk_date) use ($user) { 24 factory(UserWalking::class, 1)->create([ 25 'user_id' => $user->id, 26 'walk_date' => $walk_date //ここの正しい記述方法がわかりません 27 ]); 28 }); 29 }); 30 } 31}

php

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

##発生しているエラー

Illuminate\Database\QueryException : SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect date value: '1' for column 'walk_date' at row 1

上記のエラーが調べても解決できません。
laravel初心者のため、仕組みがよく分からずどなたかご教授いただけないでしょうか、、
よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

いま出ているエラーは、日付のフォーマットにあっていないよというエラーになります。

Collect::timesの箇所に問題があると思います。

readoubleを見ると下記のようになっています。

$collection = Collection::times(10, function ($number) { return $number * 9; });

https://readouble.com/laravel/6.x/ja/collections.html#method-times

見比べると、walk_dateの箇所に数値(今何回目か)が渡ってくる事がわかります。

Collection::times(7, function ($walk_date) use ($user) {

それの渡ってきた数値を、日付のwalk_dateに指定しようとしているため落ちています。

factory(UserWalking::class, 1)->create([ 'user_id' => $user->id, 'walk_date' => $walk_date //ここの正しい記述方法がわかりません ]);

factory()->create([])では指定されたものを上書きするので、UserWalkingFactory.phpで日付のランダム値が問題なく設定されているようなので

'walk_date' => $walk_dateをそもそも消してしまうか、 'walk_date' => '2021-10-31 10:00'のような日付のフォーマットになるような値で指定するとうまくいくと思います

投稿2021/10/31 14:15

編集2022/01/19 17:19
natsume2233

総合スコア225

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

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

退会済みユーザー

退会済みユーザー

2021/11/01 05:22

頂いたやり方で無事ランダムに挿入することが出来ました。 ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問