2017-06-19 23 views
0

Facebookのように私のアプリにはタイムラインがあり、ユーザーからのすべての投稿をリストしています。私はまた、投稿を共有し、それをpost_sharesという名前のテーブルに格納する機能を持っています。ユーザーの共有投稿をモデル投稿の同じコレクションに含めるにはどうすればよいですか?投稿のリストにユーザーの共有投稿を含める

(例表)

記事: ID、USER_ID、タイトル、DESC

post_shares: ID、post_idのは、私はforeachの($ USER-ような何かが私の見解では

をUSER_IDを>投稿を$ postとして)、すべてのユーザー投稿を取得しますが、ユーザーの共有投稿も取得したいと思います。

これを行うにはどうすればよいでしょうか?

+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つのコレクションが作成されました。 1つはユーザーの投稿と1つのユーザーが投稿を共有したものです。その後、両方のコレクションをマージすることができます

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

これについての唯一の問題は、あなたが共有1とものではありませんどのようなポスト言うことができないということです。しかし、これは次の関数

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属性を呼び出すと、すべての記事や共有ポストを得ることができます。投稿のtype属性で2を区別できます。

これは何もテストしていませんので、エラーがある場合はお知らせください。

もう1つの方法は、mysqlユニオンにすることができます。

+0

selectRawを削除すると動作します。投稿テーブルに型の列を作成する必要がありますか? –

+0

@FelipeMartinsデータベースレベルではありませんが、それはちょうどポストです。選択された生のものは間違っていましたが、私は今それを修正したと思います。 –

+0

実際には、selectRaw(*、 '"user_post" AS type')を追加しなければなりませんでした。それは今働いています、ありがとうございます! –

関連する問題