バックエンドとフロントエンドを行き来するWEBプログラマ―のメモ帳

WEBプログラマ―。バックエンドはPHP, MySQL, CentOS系, フロントエンドはJavaScript, jQuery, HTML, CSSで仕事してます。

Laravelでお気に入り機能を追加しよう

お気に入り機能のために、お気に入りテーブルfavoriteを作ります。

投稿した写真をお気に入りする機能には、
「お気に入りテーブル」に以下の情報が必要です。
・ユーザーテーブルのid
・投稿した写真のid

つまり、どのユーザーの、どの写真か?という情報でDBから抽出する必要があります。

ここで、もし、ユーザーが退会したときや、写真が削除された場合を考えてみましょう。

その際、「お気に入りテーブル」に、お気に入りした写真のidやユーザーidが、残り続けることになります。
これを防ぐために、外部キー制約を使って、
userや投稿写真が削除されたとき、自動的に「お気に入りテーブル」内のそれに関連したユーザーID、写真IDも全て削除しておきます。

LaravelにはonDelete('cascade');という機能があり、これで外部キー制約をつけます。

現在のテーブル構成は以下になります。
・upload_images - 投稿した写真
・users - 登録ユーザー
・favorite - お気に入りした投稿した写真のidを格納

<?php

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

class CreateFavoriteTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('favorite', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id');
            $table->integer('photo_id');
            $table->timestamps();

            // userが削除されたとき、関係しているお気に入りも全て削除
            $table->foreign('user_id')
                  ->references('id')
                  ->on('users')
                  ->onDelete('cascade'); 

            // upload_imagesの写真(photo)が削除されたとき、関係しているお気に入りも全て削除
            $table->foreign('photo_id')
                  ->references('id')
                  ->on('upload_images')
                  ->onDelete('cascade'); 
        });
    }

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