Как отфильтровать записи через отношения hasMany в Laravel - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь написать сайт с Laravel (текущая версия 5.7), и у меня есть 3 модели: Post, User и Fav. Я использую простую форму для добавления сообщений в таблицу "favs", которая имеет 3 столбца; id, user_id и post_id. И я хочу перечислить сообщения, которые пользователь добавил в избранное, но я не могу правильно использовать метод hasMany.

Я могу использовать переменные вроде; $ post-> user-> name, но я не могу понять, как использовать отношения с таблицей favs.

Почтовая модель

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

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

Любимая модель

public function users() {
    return $this->hasMany('App\User');
}
public function posts() {
    return $this->hasMany('App\Post', 'post_id', 'id');
}

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

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

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

Контроллер

public function user($id){

    $favs = Fav::orderBy('post_id', 'desc')->get();
    $user = User::find($id);
    $posts = Post::orderBy('id', 'desc')->where('user_id', $id)->where('status', '4')->paginate(10);
    return view('front.user')->with('user', $user)->with('posts', $posts)->with('favs', $favs);
}

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Модель Fav имеет только один User и Post каждый, поэтому вам нужно использовать belongsTo() вместо hasMany и изменить имена методов на единственное. Вы также можете удалить дополнительные параметры в post(), так как они являются значениями по умолчанию.

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

Загрузка всех Post s, которые избрал пользователь:

$user->favs()->with('post')->get();

Метод with() используется для нетерпеливой загрузки отношения .

Теперь вы можете просмотреть Fav s:

@foreach($favs as $fav)
{{ $fav->post->name }}
@endforeach
1 голос
/ 12 апреля 2019

Я думаю, вы можете изменить эти две строки своего кода на

$posts = Post::orderBy('id', 'desc')->where('user_id', $id)->where('status', '4')->paginate(10);
return view('front.user')->with('user', $user)->with('posts', $posts)->with('favs', $favs);

до

$posts = Post::where('user_id', $id)->where('status', '4')->latest()->paginate(10);
return view('front.user', compact('user', 'posts', 'favs'));

А для получения любимых постов пользователя,

если вы измените таблицу fav, чтобы она стала сводной, чтобы обрабатывать только многие и многие отношения между почтой и пользователем, вы можете получить ее как $user->posts, для отдельной модели, я думаю, вы можете рассмотреть что-то вроде $user->favs и в поле зрения

В модели Fav

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

и в поле зрения

@foreach ( $user->favs as $fav )
    {{ $fav->post->id }}
@endforeach
0 голосов
/ 12 апреля 2019

Если у пользователя, например, много любимых, вам нужно использовать блок итерации, например, foreach.

Пример:

foreach($user->favs as $fav) {
    dd($fav) // do something
}

Ps .: Будьте осторожны, чтобы не перепутать hasMany и принадлежит ToMany.

...