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'); } }