【问题标题】:Include user's shared posts into posts list将用户的共享帖子包含到帖子列表中
【发布时间】:2017-11-22 00:44:10
【问题描述】:

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

(示例表)

帖子: id,user_id,title,desc

post_shares: id,post_id,user_id

在我看来,我做了一些类似 foreach($user->posts as $post) 的事情,我得到了所有用户的帖子,但我也想获取用户的共享帖子。

最好的方法是什么?

【问题讨论】:

标签: php laravel


【解决方案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');
}

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

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

另一种方法可以是 mysql union。

【讨论】:

  • 当我删除 selectRaw 时它可以工作。我必须在帖子表上创建一个类型列吗?
  • @FelipeMartins 不,在数据库级别,这只是一个帖子,我认为如果你现在再试一次,它会起作用。选择原始文件是错误的,但我想我现在已修复它。
  • 实际上我必须添加 selectRaw(, '"user_post" AS type') 因为没有 "" 查询没有得到帖子数据。现在可以用了,谢谢!!
【解决方案2】:

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

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

SELECT id, user_id, title, desc 
FROM posts p

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

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

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    相关资源
    最近更新 更多