2015-08-16 46 views
2

我正在嘗試爲用戶帖子實現「喜歡」功能的副項目。我們正在使用Laravel的ORM,並且我們希望使用急切的加載來簡化操作,下面我將概述這個問題。有些信息首先,post.php中模型包含這樣的:如何使用Laravel Eloquent中的加載加載索引返回的數組?

public function likes() 
{ 
    return $this->hasMany('App\Models\PostLike', 'post_id', 'post_id'); 
} 

的PostController.php執行API調用來加載職位,他們喜歡看起來像:

$posts = Post::with("likes")->where("group_id", "=", $group_id)->get(); 

一個例子從JSON響應帖子API可能是這樣的:

[ 
    { 
     "post_id":1, 
     "group_id":1, 
     "author_id":1, 
     "text":"Some text here.", 
     "created_at":"2015-08-13 00:15:08", 
     "updated_at":"2015-08-13 00:15:08", 
     "likes":[ 
      {"post_id":1,"user_id":1,"updated_at":"2015-08-14 03:05:48"} 
     ] 
    } 
] 

這樣做的問題是,「喜歡」不被索引USER_ID,所以你必須通過數組進行搜索,以確定我如果用戶喜歡該帖子或者不喜歡,可以通過唯一的user_id鍵索引它。這將產生類似:

[ 
    { 
     "post_id":1, 
     "group_id":1, 
     "author_id":1, 
     "text":"Some text here.", 
     "created_at":"2015-08-13 00:15:08", 
     "updated_at":"2015-08-13 00:15:08", 
     "likes":{ 
      "1": {"post_id":1,"user_id":1,"updated_at":"2015-08-14 03:05:48"} 
     } 
    } 
] 

所以最終的問題是我們如何指數則返回一個列的積極加載的響應?

回答

7

爲了達到這個目的,您需要在您的代碼中添加額外的後處理步驟,以便通過ID索引該數組。這是非常容易使用收集的幫手方法keyBy()

你需要的是一個訪問器,如果需要可以加載關係並重新索引數組。即使沒有急切地加載關係,這個訪問器也可以用於不同的場景,這就是爲什麼需要處理關係加載的原因。

並稱方法您模型應該做的伎倆:

public function getLikesAttribute() { 
    return $this->getRelationValue('likes')->keyBy('user_id'); 
} 

自定義訪問器在這樣的情況下采取上述關聯定義優先級,當BOTU 喜歡()getLikesAttribute()存在。這就是爲什麼你的訪問者將被調用,當你做$ post->喜歡,並將重新索引表。

+0

很好的答案! 作爲供參考,術語是一個**雄辯Accessor **:[Laravel文檔](https://laravel.com/docs/5.2/eloquent-mutators#accessors-and-mutators) – Roark

+0

這是真的,謝謝你的小費。我更新了這個帖子 –

+0

非常棒。我知道必須有一個簡單的方法,謝謝! – Staysee

相關問題