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

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

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

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

818閲覧

Laravelで予約データを保存したい

ranerane0101

総合スコア70

Laravel

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2021/11/21 09:17

Laravel8.xを使っています。room周りの挙動は問題ないので、reservation関連、そしてLaravel、サーバーサイド関連のエラーなのはエラーメッセージ

Failed to load resource: the server responded with a status of 500 (Internal Server Error) isAxiosError.js:10 Uncaught (in promise) Error: Request failed with status code 500 at e.exports (isAxiosError.js:10) at e.exports (isAxiosError.js:10) at XMLHttpRequest.l.onreadystatechange (isAxiosError.js:10)

で分かるのですが、axiosとの連携がうまくいきません。https://blog.capilano-fw.com/?p=9269ここのサイトを見てやっています。

・やったこと
http://127.0.0.1:8000/reservation/reservation_list ここにアクセスして

{"reservations":[]}

これが返されていて、axiosが?Laravelでjson形式が返せていないことが確認出来た。
➁web.phpのControllers関連のコードを8.0からフルパスが必要?と見たのでApp\Http\Controllers\ReservationController::classこのようにReservationControllerより上の階層も記述した。

➂RouteServiceProvider.phpの```ここに言語を入力
protected $namespace = 'App\Http\Controllers';これをコメントアウトして使えるようにした。

➃indexアクションが機能していて他が機能していないので、マイグレーションなどのエラーではないことの確認をした。

どうかよろしくお願い致します。

Reservation.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Reservation extends Model { use HasFactory; }

web.php

1<?php 2 3 4use Illuminate\Support\Facades\Route; 5use App\Http\Controllers\ReservationController; 6 7/* 8|-------------------------------------------------------------------------- 9| Web Routes 10|-------------------------------------------------------------------------- 11| 12| Here is where you can register web routes for your application. These 13| routes are loaded by the RouteServiceProvider within a group which 14| contains the "web" middleware group. Now create something great! 15| 16*/ 17 18Route::get('/', function () { 19 return view('welcome'); 20}); 21 22Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () { 23 return view('dashboard'); 24})->name('dashboard'); 25 26Route::prefix('reservation')->middleware('auth:sanctum')->group(function(){ 27Route::get('/', [App\Http\Controllers\ReservationController::class, 'index'])->name('reservation.index'); 28Route::get('/reservation_list', [App\Http\Controllers\ReservationController::class, 'reservation_list'])->name('reservation.reservation_list'); 29 30 Route::post('/', [App\Http\Controllers\ReservationController::class, 'store'])->name('reservation.store'); 31});
ReservationController.php <?php namespace App\Http\Controllers; use App\Models\Reservation; use App\Models\Room; use Illuminate\Http\Request; class ReservationController extends Controller { public function index(){ $rooms = Room::select('id', 'name', 'time_steps')->get(); return view('reservation.index')->with([ 'rooms'=> $rooms ]); } public function store(Request $request){ $reservation = new Reservation(); $reservation->user_id = auth()->id(); $reservation->room_id = $request->room_id; $reservation->starts_at = $request->start_at; $result = $reservation->save(); return ['result' => $result]; } public function reservation_list(Request $request){ $reservations = Reservation::select('id', 'room_id', 'starts_at')->whereDate('starts_at', $request->date)->get(); return [ 'reservations' => $reservations ]; } }

index.blade.php

<html> <head> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"> </head> <body> <div id="app"> <div class="p-3"> <div class="btn-group mb-4"> <button type="button" class="btn btn-outline-secondary" @click="moveDate(-1)">&lt;</button> <button type="button" class="btn btn-outline-secondary" v-text="date"></button> <button type="button" class="btn btn-outline-secondary" @click="moveDate(1)">&gt;</button> </div> <div class="mb-5" v-for="room in rooms"> <h4> <span class="badge rounded-pill bg-info text-dark" v-text="room.name">Info</span> </h4> <div v-for="hours in allHours"> <div class="row"> <div class="col-auto pr-5 py-2" > <span v-text="getPaddedNumber(hours)">時</span> </div> <div class="col-auto p-2" v-for="minutes in room.time_step_values"> <button class="btn btn-outline-dark" data-toggle="tooltip" :title="getTimeRange(hours, minutes, room.time_steps)" v-text="getPaddedNumber(minutes)" :disabled="!isReservationAvailable(room.id, hours, minutes)" @click="reserve(room.id, hours, minutes)"> </button> </div> </div> </div> </div> </div> </div> <script src="https://unpkg.com/vue@3.0.11/dist/vue.global.prod.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.21.1/axios.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/luxon/1.27.0/luxon.min.js"></script> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.min.js"></script> <script> Vue.createApp({ data(){ return{ reservations: [], allHours: [], dt: null, rooms: @json($rooms) } }, methods: { getReservations(){ const date = this.dt.toFormat('yyyy-MM-dd'); const url = '{{ route('reservation.reservation_list')}}?date='+date; axios.get(url) .then(response =>{ this.reservations = response.data.reservations; }); }, getPaddedNumber(number){ return number.toString().padStart(2, '0'); }, getTimeRange(hours, minutes, timeSteps){ const startDt = this.dt.set({ hours: hours, minutes: minutes }) const endDt = startDt.plus({ minutes: timeSteps}); return startDt.toFormat('H:mm') + ' ~ ' + endDt.toFormat('H:mm') + ' のご予約'; }, isReservationAvailable(roomId, hours, minutes){ //現在から日にち時点の00秒に移動 const today = luxon.DateTime.now().startOf('day'); if(this.dt < today){ return false; } const dt = this.dt.set({ hours: hours, minutes: minutes }) const startsAt = dt.toFormat('yyyy-MM-dd HH:mm:00'); const hasReservation = this.reservations.some(reservation => { return( parseInt(reservation.room_id) === parseInt(roomId) && reservation.starts_at ===startsAt ) }); return !hasReservation; }, moveDate(days){ this.dt = this.dt.plus({ days: days }); }, reserve(roomId, hours, minutes){ if(confirm('予約します。よろしいでしょうか?')){ const dt = this.dt.set({ hours: hours, minutes: minutes }); const url = '{{ route('reservation.store')}}'; const params = { room_id: roomId, start_at: dt.toFormat('yyy-MM-dd HH:mm') }; axios.post(url, params) .then(response =>{ if(response.data.result === true){ this.getReservations(); } }); } } }, computed: { date(){ if(this.dt){ return this.dt.toFormat('yyyy/MM/dd'); } return ''; } }, watch: { dt(){ this.getReservations(); } }, mounted(){ for(let i = 0 ; i < 24 ; i++){ this.allHours.push(i); } this.dt = luxon.DateTime.now().startOf('day'); Vue.nextTick(() =>{ $('[data-toggle="tooltip') . tooltip({ placement: 'right' }); }); } }) .mount('#app'); </script> </body> </html>

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

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

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

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

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

skys215

2021/11/21 09:49

laravel.logにエラーは載ってますか?
ranerane0101

2021/11/21 14:13

[2021-11-20 00:38:40] local.ERROR: SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: 'yyy-11-20 00:15' for column `reservedb`.`reservations`.`starts_at` at row 1 (SQL: insert into `reservations` (`user_id`, `room_id`, `starts_at`, `updated_at`, `created_at`) values (11, 1, yyy-11-20 00:15, 2021-11-20 00:38:40, 2021-11-20 00:38:40)) {"userId":11,"exception":"[object] (Illuminate\\Database\\QueryException(code: 22007): SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: 'yyy-11-20 00:15' for column `reservedb`.`reservations`.`starts_at` at row 1 (SQL: insert into `reservations` (`user_id`, `room_id`, `starts_at`, `updated_at`, `created_at`) values (11, 1, yyy-11-20 00:15, 2021-11-20 00:38:40, 2021-11-20 00:38:40)) at C:\\xampp\\htdocs\\laravel\\Portfolio\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php:703) これでしょうか?すいません初めて確認して膨大な量だったので日付でファイル検索して出てきたエラーログですが。
skys215

2021/11/21 15:24

エラーから見ると、日付のフォーマットが間違っています。 laravel.logは空っぽにしても構いません。
ranerane0101

2021/11/23 14:56

すいません、{"userId":11,"exception":"[object]  これは下のことでしょうか? class UserFactory extends Factory { /** * The name of the factory's corresponding model. * * @var string */ protected $model = User::class; /** * Define the model's default state. * * @return array */ public function definition() { return [ 'name' => $this->faker->name(), 'email' => $this->faker->unique()->safeEmail(), 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'remember_token' => Str::random(10), ]; } 10人しか登録できないのに11人目を登録したのは覚えがあるので。
skys215

2021/11/24 01:09

違います、Reservationの所だと思います。
ranerane0101

2021/11/24 08:03

Reservation.phpに書き洩らしがあるということですか?
skys215

2021/11/24 08:22

違います。Reservationに書き間違いた場所があると思います。 完全なログを提供できますか?
ranerane0101

2021/11/24 10:56

laravel.logのことですか?ログとは?ReservationもReservationControllerなのかはたまた他のReservation?なのか正確なファイル名ですと確認しやすいです。それとも上記に挙げたファイルとは別のReservation?のことなのでしょうか?すいません。
ranerane0101

2021/11/24 14:22 編集

database.php 'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], .env DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=reservedb(phpmyadminのDB名と一時異なっていたがマイグレーション関連でエラーなしでした) DB_USERNAME=デフォルト設定 DB_PASSWORD=デフォルト設定
ranerane0101

2021/11/24 11:02

web.php <?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\ReservationController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () { return view('dashboard'); })->name('dashboard'); Route::prefix('reservation')->middleware('auth:sanctum')->group(function(){ Route::get('/', [App\Http\Controllers\ReservationController::class, 'index'])->name('reservation.index'); Route::get('/reservation_list', [App\Http\Controllers\ReservationController::class, 'reservation_list'])->name('reservation.reservation_list'); Route::post('/', [App\Http\Controllers\ReservationController::class, 'store'])->name('reservation.store'); });
skys215

2021/11/24 12:10

すみません、ログはlaravel.logのことで、ReservartionはReservationFactoryのことでした。 解決できたならよかったです。
ranerane0101

2021/11/24 14:23

いえいえ!本当に助かりました!ありがとうございます!!
guest

回答1

0

自己解決

local.ERROR: SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: 'yyy-11-20 00:15' for column

yyy→yyyyに直したら動きました。質問への回答では無かったのでベストアンサーには選べませんでしたが、laravel.logを見るよう提案して頂いたことが解決に直結しました。お騒がせして申し訳ありませんでした。

投稿2021/11/24 11:23

ranerane0101

総合スコア70

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問