簡體   English   中英

如何通過Laravel中的hasMany關系過濾條目

[英]How to filter entries via hasMany relationship in Laravel

我正在嘗試使用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);
}

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()方法用於渴望加載關系

現在您可以遍歷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'));

為了檢索用戶喜歡的帖子,

如果您將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

例如,如果一個用戶有多個收藏夾,則需要使用迭代塊,例如foreach。

例:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM