2014-06-07 36 views
1

我有樂趣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 
} 
....... 

我認爲這不是一個好這樣做的方式,因爲$收藏將會增長很多......但是,對於新的查詢,我真的不知道如何緩存帖子,以便每次用戶登錄或瀏覽帖子頁面時都不必查詢數據庫。

在此先感謝!

+0

'如果用戶已經喜歡',哪個用戶? –

+0

沒有「最佳的......」的方式。有很多不同的方式來執行任務,但在討論最佳方式時它會變得過於主觀。重要的是你要記住最好的編程實踐。這個問題也很廣泛。這就像問。什麼是創建井字遊戲程序的最佳方式。可以請縮小它,也許給你的嘗試的例子(S)? – bestprogrammerintheworld

+0

問題是我想獲取帖子列表,同時知道登錄的用戶模型是否已經以高效的「mysql」方式喜歡這些帖子 – Tenzoru

回答

0

什麼是檢索後模型的列表的有效方式和 檢查,如果登錄用戶已經喜歡/ upvoted呢?

Post模型

聲明的關係:

public function likedByUser() 
{ 
    return $this->belongsToMany('User', 'user_likes', 'post_id', 'user_id') 
      ->where('user_id', Auth::user()->id); 
} 

然後檢索已喜歡用已登錄的用戶這樣的帖子:

$posts = Post::has('likedByUser')->get(); 

更新:

$posts = Post::get(); 
$firstPost = $posts->first(); 
$firstPost->has('likedByUser'); 

你也可以循環和檢查:

$posts = Post::get(); 
foreach($posts as $post) { 
    if($post->has('likedByUser')) { 
     // liked it 
    } 
} 
+0

問題是我需要獲取所有現有的帖子,而不僅僅是Auth用戶喜歡的帖子,但我需要獲取它們的屬性,告訴用戶是否已經喜歡該帖子。我想只用一個或兩個查詢來完成,而不是在foreach循環中檢查它,它將逐個檢查每個帖子,爲每個帖子創建一個查詢。 – Tenzoru

+1

感謝您的更新回答@WereWolf,但是,做一個foreach循環來檢查每一篇文章會對數據庫執行一個新的查詢,對吧?所以,如果我有100個帖子,它會使100個查詢,如果有很多登錄用戶它查詢的數量會增長很多?預先感謝 – Tenzoru

+0

是的,但你也可以嘗試'$ posts = Post :: with('likedByUser') - > get();如果($後>第一() - > getRelation( 'likedByUser') - >計數())'; –

0

我真的不知道,如果它是好還是不好,但我沒有這樣說:

郵政型號:

public function likes() 
{ 
    return $this->hasMany('Like'); 
} 

public function likedByUser() 
{ 
    return $this->likes()->where('user_id', Auth::user()->id); 
} 

比刀片:

@if(isset($post->likedByUser[0])) 
style="background-position: right;" data-value="liked" 
@endif 

我沒有太多關於速度,但每次我分頁9-12,所以它不是那麼糟糕,我豪PE :)

相關問題