我的应用程序中有一个时间轴,就像Facebook一样,我列出了用户的所有帖子。我还有一个函数来共享一个帖子并将其存储在一个名为post_shares的表中。如何在模型Post的同一集合中包含用户的共享帖子?
(示例表)
帖子: ID,USER_ID,标题,内容描述
post_shares: ID,POST_ID,USER_ID
在我看来,我做了类似foreach($ user->帖子为$ post)的内容,我收到了所有用户帖子,但我也想获取用户的共享帖子。
最好的方法是什么?
答案 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
您可以继续在查询中添加所需的所有逻辑,结果应该与所有需要的信息混合。