我有樂趣Laravel框架,試圖建立一個小「博客」網站,工作方式如下:如何獲取帖子列表並檢查用戶是否已經「喜歡」他們? (檢查兩種模型之間的現有關係)
- 當你進入的網頁,的緩存索引最新/最熱門的帖子顯示
存在用戶和後模型之間的多對多的關係「user_likes」,所以,如果你在那你可以「贊」或「給予好評」記錄每個職位的用「心臟」按鈕,這樣兩個模型之間的關係將在user_likes數據透視表中創建。
我有兩個數據庫表
用戶表:
user_id name
1 TheUser
職位表:
post_id title
1 MyPost
2 Another Post
3 Yet another post
user_likes透視表:
post_id user_id
1 1
3 1
和用戶模型類:
class User extends BaseUser {
protected $table = 'users';
public function likes()
{
return $this->belongsToMany('Post', 'user_likes','user_id','post_id');
}
}
- 的問題是,什麼是檢索後模型的列表,並檢查是否登錄用戶已經喜歡/ upvoted他們的有效途徑?
事情是,我想檢查每個帖子,如果登錄用戶和帖子模型之間的關係以最有效的方式存在。
在此先感謝!
編輯:
這SQL小提琴將是實現我想要做什麼的方式,問題是,如果我沒有錯,我將無法緩存的帖子,因爲我需要每次都檢查他們在新用戶登錄
http://www.sqlfiddle.com/#!2/e5bab/2
使用Laravel的查詢生成器:
DB::table('posts')
->leftJoin('user_likes', function($join) {
$join->on('user_likes.post_id', '=', 'posts.id')
->where('user_likes.user_id', '=', 1);
})
->select('posts.id as post_id', 'posts.title', 'user_likes as did_i_like')
->groupBy('posts.id')
->orderBy('posts.id');
現在,我正在做我的應用程序以不同的方式:
我有分頁的帖子緩存,然後每個用戶都有職位的緩存集合的ID,他們喜歡,所以當他們登錄,我會檢查每一個職位是用戶的喜歡收集後在:
$liked = Auth::user()->getLikedPosts(); // returns a cached collection of the User liked posts ids
$posts = Post::popular(1); // returns a cached and paginated index of the most popular posts.
然後,我會檢查是否喜歡收集含有的帖子ID:
foreach($posts as $post)
{
.......
if($liked->contains($post->id)
{
// show red Heart
}
else
{
// show gray heart
}
.......
我認爲這不是一個好這樣做的方式,因爲$收藏將會增長很多......但是,對於新的查詢,我真的不知道如何緩存帖子,以便每次用戶登錄或瀏覽帖子頁面時都不必查詢數據庫。
在此先感謝!
'如果用戶已經喜歡',哪個用戶? –
沒有「最佳的......」的方式。有很多不同的方式來執行任務,但在討論最佳方式時它會變得過於主觀。重要的是你要記住最好的編程實踐。這個問題也很廣泛。這就像問。什麼是創建井字遊戲程序的最佳方式。可以請縮小它,也許給你的嘗試的例子(S)? – bestprogrammerintheworld
問題是我想獲取帖子列表,同時知道登錄的用戶模型是否已經以高效的「mysql」方式喜歡這些帖子 – Tenzoru