如何通过拉拉维尔中的许多关系过滤条目



我正在尝试使用Laravel编写一个网站(当前版本为5.7(,我有3种模型:Post,User和Fav。我正在使用一个简单的表单将帖子添加到"收藏夹"表中,该表有 3 列;同上,user_id和post_id。我想列出用户添加收藏夹的帖子,但我无法正确使用"hasMany"方法。

我可以使用诸如以下变量; $post->user->name,但我无法弄清楚如何使用与"收藏夹"表的关系。

帖子模型

public function user() {
    return $this->belongsTo('AppUser');
}
public function favs() {
    return $this->hasMany('AppFav');
}

最爱模型

public function users() {
    return $this->hasMany('AppUser');
}
public function posts() {
    return $this->hasMany('AppPost', 'post_id', 'id');
}

用户模型

public function posts() {
    return $this->hasMany('AppPost');
}
public function favs() {
    return $this->hasMany('AppFav');
}

控制器

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);
}

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

public function user() {
    return $this->belongsTo('AppUser');
}
public function post() {
    return $this->belongsTo('AppPost');
}

加载用户收藏的所有Post

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

with() 方法用于预先加载关系。

现在您可以循环遍历Fav

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

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

$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'));

并且为了检索用户最喜欢的帖子,

如果您要更改收藏夹表以使其成为数据透视表,仅用于处理Post和User之间的多对多关系,则可以将其作为$user->posts获取,对于单独的模型,我认为您可以考虑类似$user->favs和视图

在收藏夹模型中

public function user() {
    return $this->belongsTo('AppUser');
}
public function post() {
    return $this->belongsTo('AppPost');
}

并查看

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

如果用户(每个示例(有许多收藏夹,则需要使用迭代块,例如 foreach。

例:

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

Ps.:注意不要混淆 hasmany和 belongsToMany。

相关内容

  • 没有找到相关文章

最新更新