将用户的共享帖子包含在帖子列表中

时间:2017-06-19 17:34:59

标签: php laravel

我的应用程序中有一个时间轴,就像Facebook一样,我列出了用户的所有帖子。我还有一个函数来共享一个帖子并将其存储在一个名为post_shares的表中。如何在模型Post的同一集合中包含用户的共享帖子?

(示例表)

帖子: ID,USER_ID,标题,内容描述

post_shares: ID,POST_ID,USER_ID

在我看来,我做了类似foreach($ user->帖子为$ post)的内容,我收到了所有用户帖子,但我也想获取用户的共享帖子。

最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

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');
}

现在你有两个帖子模型的集合。一个用户帖子和一个用户共享帖子。然后你可以合并两个集合:

$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属性并获取所有帖子和共享帖子。您可以通过帖子上的type属性区分2。

我没有对此进行任何测试,如果出现错误,请告诉我。

另一种方法可能是一个mysql联盟。

答案 1 :(得分:0)

根据您刚刚设置的结构,最简单的方法是在SQL查询中使用JOIN。

如果您使用的是MySQL,它将如下所示:

SELECT id, user_id, title, desc 
FROM posts p

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

您可以继续在查询中添加所需的所有逻辑,结果应该与所有需要的信息混合。