Laravelでtwitterのフォローのような機能を作る時は、以下のようなパッケージをcomposerでインストールして実装ができます。
しかし、このようなパッケージを入れなくてもtwitterのようなフォロー機能をシンプルかつ簡単に作成できます。
今回はLaravel 8.xにおいてtwitterのようなフォロー機能の実装方法をご紹介します。
follower_userテーブルを作成
follower_userテーブルを作成するため、以下のコマンドを実行してください。
$ php artisan make:migration create_follower_user_table
follower_userでユーザーとフォロワーを関係付けます。
このテーブルは中間テーブルの働きをしますので、モデルを作成する必要はありません。
またfollower_userテーブルだけでフォロー、フォロワーがわかるので、followsテーブルを作る必要はありません。
follower_userマイグレーションを設定
follower_userテーブルのマイグレーションで以下のカラムを設定します。
user_idは認証済みのユーザーID、follower_idは自分をフォローしているユーザーIDです。
このテーブルではidやタイムスタンプは必要ないので削除します。
マイグレーションファイルの設定は以下のようになります。
class CreateFollowerUserTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('follower_user', function (Blueprint $table) {
// $table->id(); 削除
$table->unsignedInteger('user_id'); // 追加
$table->unsignedInteger('follower_id'); // 追加
// $table->timestamps(); 削除
});
}
...
}
フォロー、フォロワーの取得
フォローやフォロワーを取得するにはUserモデルにリレーションを張ります。
フォローやフォロワーのリレーションを張ったUserモデルは以下のようになります。
<?php
namespace App\Models;
...
class User extends Authenticatable
{
use HasFactory, Notifiable;
....
/**
* Relationships
*/
public function follows()
{
return $this->belongsToMany(User::class, 'follower_user', 'follower_id', 'user_id');
}
public function followers()
{
return $this->belongsToMany(User::class, 'follower_user', 'user_id', 'follower_id');
}
}
リレーションを張ることで以下のようにフォロー、フォロワーを取得することができます。
// フォローしているユーザーをすべて取得
$follows = auth()->user()->follows()->get();
// フォロワーをすべて取得
$followers = auth()->user()->followers()->get();
フォロー、フォロワーのダミーデータを入れる
follower_userテーブルにダミーデータを入れます。
フォローやフォロワーを追加するには以下のようにします。
// フォローを追加
auth()->user()->follows()->attach( User::find(1) );
// フォロワーを追加
auth()->user()->followers()->attach( User::find(2) );
すべてのユーザーを作成後にfollower_userテーブルにダミーデータを入れます。
UsersSeederは以下のようになります。
<?php
namespace Database\Seeders;
...
class UsersSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$faker = Faker::create('ja_JP');
// ユーザーを50人作成
$users = User::factory()->count(50)->create();
foreach($users as $user) {
// フォローを追加
$user->follows()->attach( User::find($faker->numberBetween($min = 1, $max = 50)) );
// フォロワーを追加
$user->followers()->attach( User::find($faker->numberBetween($min = 1, $max = 50)) );
}
}
}
フォローやフォロワーを削除したい場合は以下のようにdetach()
を使います。
// フォローを削除
auth()->user()->follows()->detach( User::find(1) );
// フォロワーを削除
auth()->user()->followers()->detach( User::find(2) );
おわり
twitterのフォロー機能が案外簡単に実装できました。
多様なサービスが展開されていますが、フォロー機能を実装したサービスが増えています。
是非参考にして下しさい。
コメント