【Laravel】(準備編)世界一シンプルで簡単なフォロー機能の実装

こんにちは、わいまつです。 今回は、LaravelでTwitterのようなフォロー機能を実装していきたいと思います。

こちらの記事はLaravelでフォロー機能を実装するにあたり、いくつかのパターンで紹介します。 パターン1では、リレーションメソッドなしで実装する例になります。 全3パターンを考えていて、それぞれの概要は以下になります。

パターン 概要
パターン1 (難易度★☆☆)

リレーションメソッドなしでシンプルに実装

パターン2 (難易度★★☆) belongsToを使って実装(準備中)
パターン3 (難易度★★★) belongsToManyを使って実装(準備中)

Laravelの初学者の方や、違いを比較検討したいかたはぜひ御覧ください。

フォロー機能の実装(準備編)

概要

こちらのパターンでは、リレーションメソッド(hasMany、belongsToなど)を用いずに、シンプルで簡単なフォロー機能を実装します。

複雑な機能はいらない!単純にフォローしているかどうか表示したい!などの場合に役立つと思います。

以下のようなメリット・デメリットがあります。

メリット

  • リレーションメソッドを使わないため実装がシンプル
  • フォロー機能のイメージをつかめる

デメリット

  • 関係を持たないため、紐付いたデータの取得がやりにくい

完成イメージ

まず、完成イメージはこちらになります。

準備編

まず、準備として、プロジェクトの作成〜DBへのデータ登録までを載せておきます。

こちらはパート1〜パート3まで共通の作業になります。1回実行したら必要有りません。

1.プロジェクトの作成

新規にプロジェクトを作成します。今回は最新バージョンを使うためバージョン指定はありません。

$ composer create-project laravel/laravel belongs-to
$ npm install
$ npm run watch
$ php artisan serv

2..envの編集

適宜自分の環境に合わせて変更してください。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=follow_belongsto
DB_USERNAME=root
DB_PASSWORD=

3.認証の追加(※Laravel5系以前の場合は異なります)

$ composer require laravel/ui php artisan ui vue —auth

4.マイグレーションファイルの作成

$ php artisan make:migration create_followers_table

5.マイグレーションファイルの編集

今回のパターンではリレーションを持たないため外部キー制約を付ける必要はないのですが、今後のためにつけておくことをオススメします。

外部キーをつけるときに注意なのは、型を揃える必要があります。

/belongs-to/database/migrations/****_**_**_******_create_followers_table.php


<?php

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

class CreateFollowersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('followers', function (Blueprint $table) {
            $table->id();
            // unsignedBigIntegerじゃないとエラー https://qiita.com/ucan-lab/items/976d4d8b45685b1a4ada
            $table->unsignedBigInteger('following_id')->comment('フォローしているユーザーID(ログインID)');
            $table->foreign('following_id')->references('id')->on('users');
            $table->unsignedBigInteger('followed_id')->comment('フォローされているユーザーID(対象ユーザーID)');
            $table->foreign('followed_id')->references('id')->on('users');
            $table->timestamps();
        });
    }

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

6.マイグレーション実行

$ php artisan migrate
$ mysql で確認

7.シーダーの作成

ユーザーテーブルのシーダーを作成します。

$ php artisan make:seeder UsersTabelsSeeder

/belongs-to/database/seeds/UsersTabelsSeeder.php

<?php

use Illuminate\Database\Seeder;
use Carbon\Carbon; // 忘れずに

class UsersTabelsSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $params = [
            'name' => 'testym1',
            'email' => 'testym1@test.com',
            'password' => bcrypt('testym'),
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now()
        ];
        DB::table('users')->insert($params);
        $params = [
            'name' => 'testym2',
            'email' => 'testym2@test.com',
            'password' => bcrypt('testym'),
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now()
        ];
        DB::table('users')->insert($params);
        $params = [
            'name' => 'testym3',
            'email' => 'testym3@test.com',
            'password' => bcrypt('testym'),
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now()
        ];
        DB::table('users')->insert($params);
    }
}

続けて、Followersテーブルのシーダーも作成します。

$ php artisan make:seeder FollowersTabelsSeeder

/belongs-to/database/seeds/FollowersTabelsSeeder.php

<?php

use Illuminate\Database\Seeder;
use Carbon\Carbon; // 忘れずに

class FollowersTabelsSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $params = [
            'following_id' => 1,
            'followed_id' => 2,
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now()
        ];
        DB::table('followers')->insert($params);
        $params = [
            'following_id' => 1,
            'followed_id' => 3,
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now()
        ];
        DB::table('followers')->insert($params);
        $params = [
            'following_id' => 2,
            'followed_id' => 1,
            'created_at' => Carbon::now(),
            'updated_at' => Carbon::now()
        ];
        DB::table('followers')->insert($params);
    }
}

8.シーダーの実行

シーダーを動かすためにDatabaseSeederに登録します。

/belongs-to/database/seeds/DatabaseSeeder.php


<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // $this->call(UserSeeder::class);
        $this->call(UsersTabelsSeeder::class);
        $this->call(FollowersTabelsSeeder::class);
    }
}
$ php artisan db:seed

9.モデル作成

$ php artisan make:model Follower

10.確認

一旦ここで確認してみましょう!

$ php artisan serve

エラーや、画面崩れがなければOKです!

まとめ

今回は準備編ということで、次回実装編を投稿予定です。

パターン 概要
パターン1 (難易度★☆☆)

リレーションメソッドなしでシンプルに実装

パターン2 (難易度★★☆) belongsToを使って実装(準備中)
パターン3 (難易度★★★) belongsToManyを使って実装(準備中)

Twitterでは日々の気づき等もつぶやいているのでぜひご登録ください。よければコメント、記事のシェア等してくれたら嬉しいです。ではまた。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です