Polymorphi c, получить понравившиеся пользователю действия - PullRequest
0 голосов
/ 19 июня 2020

У меня есть полиморфизм c один-ко-многим, определенный между Activity и Like. Пользователю может понравиться действие, но
как я могу получить все действия, которые понравились пользователю?

class Activity extends Model
{   
    public function likes(){
        return $this->morphMany('App\Like', 'likeable');
    }

    public function like($user = 0){
        $this->likes()->updateOrCreate([
            'user_id' => $user ? $user->id : Auth::id(),
        ], [
            'liked' => true
        ]);
    }
}
class Like extends Model
{
    public function likeable(){
        return $this->morphTo();
    }
}
class User extends Authenticatable
{
    public function likes(){
        // Get all liked activities by a user.
    }
}

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Я придумал:

    public function likedActivities(){
        $collection = collect();
        foreach ($this->likes as $like) {
            $collection = $collection->add($like->likeable);
        }
        return $collection;
    }

Это возвращает все действия, которые понравились пользователю. Может быть, есть более элегантный способ сделать это?

0 голосов
/ 19 июня 2020

Обновлено

В модели User:

public function likes(){
    return $this->hasMany('App\Like');
}

И получение лайков будет; $user->likes->where('liked', true);

Мой первый ответ был неправильным.

Или вы можете использовать пакет для лайков: https://github.com/overtrue/laravel-like

...