2017-06-19 70 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类型'),因为没有“*”查询没有获得发布数据。现在正在工作,谢谢! –