如何通过Laravel中的hasMany关系过滤条目

时间:2019-04-12 13:18:45

标签: php laravel eloquent has-many

我正在尝试使用Laravel(当前版本为5.7)编写一个网站,并且我有3种模型:Post,User和Fav。我使用一种简单的形式将帖子添加到“收藏夹”表中,该表有3列; id,user_id和post_id。我想列出用户添加了收藏夹的帖子,因为我不能正确使用“ hasMany”方法。

我可以使用类似的变量; $ post-> user-> name,但我不知道如何使用与“收藏夹”表的关系。

帖子模型

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 个答案:

答案 0 :(得分:1)

Fav模型只有一个UserPost,因此您需要使用belongsTo()而不是hasMany并将方法名称更改为单数。您还可以删除post()中的其他参数,因为它们是默认值。

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

加载用户喜欢的所有Post

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

with()方法用于eager load the relationship

现在您可以遍历Fav了:

@foreach($favs as $fav)
{{ $fav->post->name }}
@endforeach

答案 1 :(得分:1)

我认为您可以将代码的这两行更改为

$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表更改为仅用于处理Post和User之间的多对多关系的数据透视表,则可以将其设为$user->posts,对于单独的模型,我认为您可以考虑类似于$user->favs并在视图范围内

在收藏夹模型中

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

答案 2 :(得分:0)

例如,如果一个用户有很多收藏夹,则需要使用迭代块,例如foreach。

示例:

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

附注:请注意不要混淆hasMany和belongsToMany。