環境
PHP 7.3
Laravel 5.8
Laravelにいいね機能を実装しようと思い、調べていたらLaravel-LoveというライブラリがLaravel Newsで紹介されていました。
準備
今回はUser
モデルでPost
モデルにいいねします。
インストール
$ composer require cybercog/laravel-love
$ php artisan migrate
Like
タイプを生成
$ php artisan love:reaction-type-add Like 1
Reactarebl(いいねするモデル)の準備
app/User.php
<?php
namespace App;
use Cog\Contracts\Love\Reacterable\Models\Reacterable as ReacterableContract;
use Cog\Laravel\Love\Reacterable\Models\Traits\Reacterable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements ReacterableContract
{
use Reacterable;
}
$ php artisan love:setup-reacterable --model="App\User" --nullable
Reactable(いいねされるモデル)準備
app\Post.php
<?php
namespace App;
use Cog\Contracts\Love\Reactable\Models\Reactable as ReactableContract;
use Cog\Laravel\Love\Reactable\Models\Traits\Reactable;
use Illuminate\Database\Eloquent\Model;
class Post extends Model implements ReactableContract
{
use Reactable;
}
$ php artisan love:setup-reactable --model="App\Post" --nullable
実際にいいねする
<?php
use App\User;
use App\Post;
use Cog\Laravel\Love\ReactionType\Models\ReactionType;
$user1 = User::find(1);
$post1 = Post::find(1);
$likeType = ReactionType::fromName('Like');
//リアクター、リアクタントとして登録。
//すでに登録してある場合、例外が投げられます。
if ($user1->isNotRegisteredAsLoveReacter()) {
$user1->registerAsLoveReacter();
}
if ($post1->isNotRegisteredAsLoveReactant()) {
$post1->registerAsLoveReactant();
}
$reacter = $user1->getLoveReacter();
$reactant = $post1->getLoveReactant();
//$user1が$post1をいいねしていないことを確認
if ($reacter->isNotReactedToWithType($reactant, $likeType)) {
//$user1で$post1をいいね
$reacter->reactTo($reactant, $likeType);
}
//$user1がいいねしたPostが入ったCollectionを取得
$posts = Post::query()
->whereReactedByWithType($reacter, $likeType)
->get();
//$post1をいいねしたUserが入ったCollectionを取得
$likeReactions = $post1
->getLoveReactant()
->reactions()
->where('reaction_type_id', ReactionType::fromName('Like')->getId())
->get();
$likeUsers = [];
foreach ($likeReactions as $likeReaction) {
$likeUsers[] = User::where('love_reacter_id', $likeReaction->getReacter()->id)->first();
}
//$post1をいいねした数を取得
count($likeUsers);
//いいね解除
if ($reacter->isReactedToWithType($reactant, $likeType)) {
$reacter->unreactTo($reactant, $likeType);
}