2017-06-19 114 views
0

我在我的應用程序中有一個時間線,就像Facebook一樣,我列出了用戶的所有帖子。我也有一個函數來共享一個帖子,並將其存儲在名爲post_shares的表中。如何將用戶的共享帖子包含在模型Post的同一個集合中?在帖子列表中包含用戶的共享帖子

(示例表)

帖子: ID,USER_ID,標題,說明

post_shares: ID,POST_ID邀請,USER_ID

在我看來,我做類似的foreach($用戶>職位爲$職位),我得到所有用戶職位,但我想獲取用戶的共享職位了。

這樣做的最好方法是什麼?

+0

閱讀laravel中的'eager loading' https://laravel.com/docs/5.4/eloquent-relationships#eager-loading –

回答

0

根據您剛剛設置的結構,最簡單的方法是使用SQL查詢中的JOIN。

如果你正在使用MySQL它看起來就像這樣:

SELECT id, user_id, title, desc 
FROM posts p 

INNER JOIN shares s 
ON s.post_id = p.id 

您可以繼續添加您需要的查詢中的所有邏輯和結果應與所有必要的信息組合。

0

shared_posts創建一個多對多的關係:https://laravel.com/docs/5.4/eloquent-relationships#many-to-many
下面是一個未經測試的例子。

public function sharedPosts() 
{ 
    //Probably can be shorter, look at the laravel docs. 
    return $this->belongsToMany('App\Post', 'post_shares', 'post_id', 'user_id'); 
} 

現在你有2個系列的兩個模型。一個與用戶帖子和一個與用戶共享帖子。然後你可以合併這兩個集合:

$posts->merge($sharedPosts)->sortBy('created_at'); 

唯一的問題是,你不能告訴哪些帖子是共享的,什麼不是。但是,這可以通過以下功能

public function getAllPostsAttribute() 
{ 
    $posts = $this->posts()->selectRaw('"user_post" AS type')->get(); 
    $sharedPosts = $this->sharedPosts()->selectRaw('"shared_post" AS type')->get(); 

    return $posts->merge($sharedPosts)->sortBy('created_at'); 
} 

現在,您可以調用用戶的allPosts屬性,並得到所有帖子和分享的職位是固定的。您可以在帖子後區分2的type屬性。

我還沒有測試過任何東西,所以請讓我知道是否有錯誤。

另一種方法可能是一個mysql聯盟。

+0

它可以在我刪除selectRaw時起作用。我必須在帖子表上創建一個類型列嗎? –

+0

@FelipeMartins沒有在數據庫級別,它只是一個職位,我想如果你現在再試一次,它會工作。選擇的原料是錯誤的,但我認爲我現在修復了它。 –

+0

其實我不得不添加selectRaw(*,'「user_post」AS類型'),因爲沒有「*」查詢沒有獲得發佈數據。現在正在工作,謝謝! –