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

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

ただいまの
回答率

90.23%

外部キー制約で設定した親テーブルのidを子テーブルのカラムに保存する方法

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 151

分からないこと

ユーザーごとに管理できる書き込み可能なカレンダーアプリを製作しています。

しかし、外部キー制約で設定したuserテーブル(親テーブル)がholidays(子テーブル)のカラムに保存させることができません。

実現させたいこと

休日の日付と予定の内容を登録すると同時にログインしているユーザーのidをカラムに保存し、カレンダーに書き込んだユーザー以外は予定を見られないようにしたいです。

実際のコード

◉migrationファイル

2014_10_12_000000_create_users_table

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('holidays');
        Schema::dropIfExists('users');
    }
}

2019_05_08_084435_holiday

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class Holiday extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
       Schema::create('holidays', function (Blueprint $table) { 
            $table->increments('id'); 
            $table->date('day'); 
            $table->string('description'); 
            $table->integer('user_id')->unsigned();
            $table->timestamps(); 

            // 参照制約(Usersテーブルへの外部キー)
            $table
            ->foreign('user_id')
            ->references('id')
            ->on('users')
            ->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('holidays');
        Schema::dropIfExists('holidays');
    }
}

◉Controller
CalendarController

<?php
namespace App\Http\Controllers;
use App\Holiday;
use App\Calendar;
use App\User;
use Illuminate\Http\Request;
class CalendarController extends Controller
{
    //
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index(Request $request)
    {

        $list = Holiday::all();
        $cal = new Calendar($list);
        $tag = $cal->showCalendarTag($request->month,$request->year);
        return view('calendar.index', ['cal_tag' => $tag]);
    }
   public function getHoliday(Request $request)
    {
        // 休日データ取得
    $data = new Holiday();
        $list = Holiday::all();
        return view('calendar.holiday', ['list' => $list,'data' => $data]);
    }
   public function getHolidayId($id)
    {
        // 休日データ取得
    $data = new Holiday();
    if (isset($id)) {
            $data = Holiday::where('id', '=', $id)->first();
        } 
        $list = Holiday::all();
        return view('calendar.holiday', ['list' => $list,'data' => $data]);
    }

    public function getUserId($id)
    {
    $data = new User();
    if (isset($id)) {
            $userData = User::where('id', '=', $id)->first();
        } 
        $user = User::all();
        return view('calendar.holiday', ['user' => $user,'data' => $userData]);
    }

    public function deleteHoliday(Request $request)
    {
        // DELETEで受信した休日データの削除
    if (isset($request->id)) {
            $holiday = Holiday::where('id', '=', $request->id)->first();
            $holiday->delete();
    }

        // 休日データ取得
    $data = new Holiday();
        $list = Holiday::all();
        return view('calendar.holiday', ['list' => $list, 'data' => $data]);
    }
    public function postHoliday(Request $request)
    {
    $validatedData = $request->validate([
        'day' => 'required|date_format:Y-m-d',
        'description' => 'required',
    ]);
        // POSTで受信した休日データの登録
    $holiday = Holiday::where('user_id', '=', auth()->id())->first();
        if (!isset($data)) {
            $holiday = new Holiday();
        }
    if (isset($request->id)) {
            $holiday = Holiday::where('id', '=', $request->id)->first();
            $holiday->day = $request->day;
            $holiday->description = $request->description;       
            $holiday->user_id = auth()->id();
            $holiday->save();
        } else {
        $holiday = new Holiday(); 
        $holiday->day = $request->day;
        $holiday->description = $request->description;        
        $holiday->save();
    }
        // 休日データ取得
    $data = new Holiday();
        $list = Holiday::all();
        return view('calendar.holiday', ['list' => $list, 'data' => $data]);
    }
}

◉routes
web.php

Route::get('/holiday','CalendarController@getHoliday');
Route::post('/holiday','CalendarController@postHoliday');
Route::get('/','CalendarController@index');
Route::get('/holiday/{id}','CalendarController@getHolidayId');
Route::delete('/holiday','CalendarController@deleteHoliday');
Auth::routes();

Route::get('/home', 'CalendarController@index')->name('home');

◉views
holiday.blade.php

@extends('layouts.app')
@section('title', '休日設定')
@section('content')
    <h1>休日</h1>
<a href="{{ url('/') }}">カレンダーに戻る</a>
    <form method="POST" action="/holiday"> 
    <div class="form-group">
    {{csrf_field()}}    <label for="day">日付[YYYY/MM/DD] </label><input type="text" name="day" class="form-control" id="day" value="{{$data->day}}">
    <label for="description">説明</label><input type="text" name="description" class="form-control" id="description" value="{{$data->description}}"> 
    </div>
    <button type="submit" class="btn btn-primary">登録</button> 
    <input type="hidden" name="id" value="{{$data->id}}">
    </form> 
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
    <table class="table">
    <thead>
    <tr>
   <th scope="col">日付</th>
    <th scope="col">説明</th>
   <th scope="col">作成日</th>
    <th scope="col">更新日</th>
    <th scope="col">削除</th>
    </tr>
    </thead>
    <tbody>
    @foreach($list as $val)
    <tr>
       <th scope="row"><a href="{{ url('/holiday/'.$val->id) }}">{{$val->day}}</a></th>
        <td>{{$val->description}}</td>
       <td>{{$val->created_at}}</td>
        <td>{{$val->updated_at}}</td>
        <td><form action="/holiday" method="post">
{{csrf_field()}} 
            <input type="hidden" name="id" value="{{$val->id}}">
            {{ method_field('delete') }}
            <button class="btn btn-default" type="submit">Delete</button>
        </form></td>
    </tr>
    @endforeach
    </tbody>
    </table>

<script>
  $( function() {
    $( "#day" ).datepicker(
{dateFormat: 'yy-mm-dd'});
  } );
</script>
@endsection
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

インデントがガタガタなので、もし本物のコードもこうなのであれば、揃えた方がいいですよ。

以下、問題の発生していると思われる部分で、気になるところに、//★コメント(本題に関係ないものも。。)を書き足しましたので、ご参考ください。

CalendarController@postHoliday

public function postHoliday(Request $request)
{
    $validatedData = $request->validate([
        'day' => 'required|date_format:Y-m-d',
        'description' => 'required',
    ]);

    // POSTで受信した休日データの登録
  //★ここから
    $holiday = Holiday::where('user_id', '=', auth()->id())->first();
    if (!isset($data)) {
        $holiday = new Holiday();
    }
  //★ここまでは、不要なのでは? この先↓で使ってないので・・・

    if (isset($request->id)) {
        $holiday = Holiday::where('id', '=', $request->id)->first();
        $holiday->day = $request->day;
        $holiday->description = $request->description;       
        $holiday->user_id = auth()->id();//★更新時は、あえて入れなくてもいいかもです。
        $holiday->save();
    } else {
        $holiday = new Holiday(); 
        $holiday->day = $request->day;
        $holiday->description = $request->description;
        //★新規登録時こそ、ユーザーIDを入れないと・・!!
        $holiday->save();
    }

    // 休日データ取得
    $data = new Holiday();
    $list = Holiday::all();
    return view('calendar.holiday', ['list' => $list, 'data' => $data]);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる