【问题标题】:Fetching data from multiple tables in laravel5从 laravel5 中的多个表中获取数据
【发布时间】:2017-03-13 14:35:07
【问题描述】:

我有两个表格 postssharedposts。 sharedposts 表包含“user_id”、“updated_at”和“post_id”列,其中 posts 表包含“id”、“title”和“body”。我知道链接两个表的关系。我要做的就是显示两个表中按“updated_at”排序的每个帖子。请帮助查询生成器和雄辩的方式。谢谢

【问题讨论】:

    标签: laravel laravel-5 eloquent laravel-5.2 laravel-query-builder


    【解决方案1】:

    代码没有经过测试,但是你可以试试这个:

    Post::whereHas('sharedpost',function($query){
        $query->orderBy('updated_at');
    })->get()
    

    【讨论】:

    • 你基本上想做什么?
    • 根据 sharedpost 表中的 updated_at 列对所有帖子进行排序。
    • 好吧,现在让我们考虑一下我有另一个表 posts 我还必须考虑这些帖子,然后与这些 shared posts 比较,以最新的为准这两个特定的帖子都应该首先显示
    • 如果此答案解决了您的问题,请接受此答案并为新问题创建一个新问题。而且,要加入表格,您可以使用merge() 函数。见https://laravel.com/docs/5.3/collections#method-merge
    • 没有解决问题
    【解决方案2】:

    如果模型更新不多,可能会采用不同的方法?这样我想阅读应该更快(如果我在这里错了,请有人纠正我)

    通过创建新的迁移和adding向表中添加另一个字段

    $table->timestamp('last_updated');
    

    然后,每当 PostSharedPost 更新时,使用 Events 更新字段,方法是将其添加到 AppServiceProvider

    public function boot()
    {
        Post::saving(function ($post) {
            $post->last_updated = Carbon::now();
        });
    }
    

    我不确定这是否可行,如果您返回反馈,我们将不胜感激,因为我现在懒得自己尝试:)。更糟糕的情况下,您可能需要将方法更改为:

    public function boot()
    {
        SharedPost::saved(function ($sharedpost) {
            $sharedpost->post->last_updated = Carbon::now();
            $sharedpost->save();
        });
    }
    

    如果您不想要 AppServiceProvider 中的代码,也可以查看 Observers。没用过,但是看起来很简单。

    那么你可以简单地Post::orderBy('last_updated')->get();

    通过这种方式,您的数据库将有一个或两个以上的输入,但我认为(如果我错了,请大家纠正我)get() 应该更快。请记住,我远不是 MySQL 专家。

    最后,您可以通过使用 Redis 将这些数据保存到缓存来使其更快。

    【讨论】:

      猜你喜欢
      • 2018-03-15
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 2017-03-22
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多