如何在 Laravel 中使用多表查询而不使用 Eloquent 关系

Posted

技术标签:

【中文标题】如何在 Laravel 中使用多表查询而不使用 Eloquent 关系【英文标题】:How to use Multi table queries in Laravel without using Eloquent Relationships 【发布时间】:2020-08-09 07:48:20 【问题描述】:

我正在使用 Laravel 为我的应用创建 API,稍后它将与 react 前端集成。我有两张表,发布和评论。帖子表包含有关帖子的信息,评论表包含有关每个帖子的 cmets 数据。下面是结构,

发布表

post_id(主键) 帖子标题 post_description

评论表

comment_id(主键) 评论文本 post_id(外键)

我需要从 post 表中获取 post_id、post_title 以及从评论表中获取每个帖子的 cmets 总数,并希望 json 数据像这样显示

        
            "post_id": 1,
            "post_title": "some title",
            "total comments": "4"

        ,

我知道如何为这些编写 sql 查询,但只是在显示上述数据时遇到问题。下面是我正在使用的代码。

$allPostQuery= DB::select('select * from post');

foreach($allPostQuery as $allPostQuery)



$postId= $allPostQuery->post_id;

$totalCommentsQuery= DB::select('select count(comment_id) as totalComments from comment where post_id=:postId',["postId" => $postId ]);



return \Response::json([$allPostQuery,$totalCommentsQuery]);

但这不起作用。我对循环发布帖子 ID 以获得每个帖子的总 cmets 感到困惑。我是否必须在前端使用 react foreach 循环来执行此操作?任何人都可以提出任何帮助。谢谢

【问题讨论】:

满足您要求的最佳方式是使用 Eloquent。使用 hasMany 模型而不是编写自己的查询。 @Gabriel 是的,你是对的。但有什么方法可以在不使用雄辩关系的情况下做到这一点? 你可以在不使用 eloquent 的情况下做到这一点,但如果你不想使用它的最佳功能之一,那么使用框架是没有意义的。 @Gabriel 明白了。但是,如果您可以在不使用 eloquent 的情况下帮助我。那是我大学的一个项目。所以我必须做到这一点没有雄辩。会很感激你。 我已经为你添加了答案。以后总是使用 ORM 或 Elloquent 关系。 【参考方案1】:

根据您的问题,您只需要每个帖子的帖子 ID、标题和评论数:

    $query = DB::select('
        SELECT 
            p.post_id, 
            p.title, 
            c.total AS totla_comments
        FROM posts p
        INNER JOIN 
        (
            SELECT post_id, COUNT(post_id) AS total FROM comments WHERE comments.post_id = post_id
            GROUP BY post_id

        ) c
        ON p.post_id = c.post_id
    ');

    echo json_encode($query);

如果您希望数据返回应该是 JSON 格式,请使用 json_encode(Laravel 有 ->json() 函数)。

看看你的方法:

    首先查询帖子 您再次循环帖子并查询 cmets

这会影响您的性能速度,应该避免。

【讨论】:

以上是关于如何在 Laravel 中使用多表查询而不使用 Eloquent 关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中使用 eloquent 执行多表选择

如何使用 Laravel8 中的 Twig 扩展注入 php GraphQL 查询结果,在 Twig(Bridge) 模板中定义查询?

laravel连接两张表查询如何只要某个字段和这个字段的统计集合

Laravel 和 vue 不提交数据而不是从数据库中查询数据

laravel 关联查询 表一、表二、两个表的关联表

如何在单个查询中使用索引进行多表连接?