Laravel 5.8 Получить информацию о подписчиках - PullRequest
1 голос
/ 02 апреля 2019

У меня есть система следующих пользователей для моего приложения, написанного на Laravel, и я пытаюсь получить данные из моей БД на основе определенных подписчиков. Это приложение рецептов с таблицей пользователей, рецептов и подписчиков. В настоящее время я получаю подписчиков пользователей, написав $ user-> учеников. Тем не менее, я хочу настроить свои отношения таким образом, чтобы я мог получить конкретные рецепты, которые принадлежат определенным пользователям-последователям. Что-то вроде $ user-> последователи-> рецепты. У меня нет правильной логики или Eloquent отношений, чтобы сделать это прямо сейчас. Любые предложения о том, как это может быть сделано?

Модель пользователя

public function followers(){
        return $this->belongsToMany(User::class, 'followers', 'leader_id', 'follower_id')->withTimestamps();
    }

    public function followings(){
        return $this->belongsToMany(User::class, 'followers', 'follower_id', 'leader_id')->withTimestamps();
    }

Модель рецепта

public function user(){
        return $this->belongsTo('App\User');
    }

    public function category(){
        return $this->belongsTo('App\Category');
    }

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

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

FollowerController

class FollowerController extends Controller
{
    public function followUser($id){
        $user = User::find($id);

        if(!$user){
            return redirect()->back()->with('error', 'User does not exist.');
        }

        $user->followers()->attach(auth()->user()->id);

        return redirect()->back()->with('success', 'You now follow the user!');
    }

    public function unfollowUser($id){
        $user = User::find($id);

        if(!$user){
            return redirect()->back()->with('error', 'User does not exist.');
        }

        $user->followers()->detach(auth()->user()->id);
        return redirect()->back()->with('success', 'You unfollowed the user!');
    }

    public function show($id){
        $user = User::find($id);
        $followers = $user->followers;
        $followings = $user->followings;

        return view('welcome')->with('user', $user);
    }

Можно ли как-то настроить отношения между моделями User, Recipe и Follow? Каков наилучший способ получения любой информации, относящейся к определенному набору последователей пользователя? Дайте мне знать, если мне нужно больше поделиться кодом с вами, ребята! Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Вы можете определить прямую связь, "пропустив" таблицу users:

class User extends Model
{
    public function followerRecipes() {
        return $this->belongsToMany(
            Recipe::class, 'followers', 'leader_id', 'follower_id', null, 'user_id'
        );
    }
}
0 голосов
/ 02 апреля 2019

Вам нужны отношения HasManyThrough.

В вашей модели пользователя:

public function recipes()
{
    return $this->hasManyThrough(
        'App\Recipe',
        'App\User',
        'leader_id',
        'user_id',
        'id',
        'id'
    );
}

Полная документация (вам может потребоваться установить некоторые внешние ключи) можно найти по адресу: https://laravel.com/docs/5.8/eloquent-relationships#has-many-through.

РЕДАКТИРОВАТЬ: я не прав.Ваши followers отношения - это многие ко многим, а не один ко многим, поэтому этот метод не сработает.Я оставлю здесь комментарий на случай, если у кого-то возникнут проблемы с отношением один-ко-многим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...