Php 将集合和数组返回到前端的区别是什么?

Php 将集合和数组返回到前端的区别是什么?,php,sql,laravel,Php,Sql,Laravel,背景 我正在使用Laravel框架进行开发,最近,我不得不从一个SQL数据库中检索一些数据,这些数据分布在几个表中,还需要根据某个列聚合结果,以便更方便地表示。作为一个概括的解决方案,我认为我至少可以通过两种方式完成任务 编写一个涉及::where和->groupBy以及其他运算符的雄辩查询 (我选择的路径)构建一个数组数组 无论哪种方式,结果都会发送回show blade页面 问题 使用每种方法的含义是什么?另外,传回一个集合(一个有说服力的查询的结果)是否真的意味着您正在将所有字段数据传递到

背景

我正在使用Laravel框架进行开发,最近,我不得不从一个SQL数据库中检索一些数据,这些数据分布在几个表中,还需要根据某个列聚合结果,以便更方便地表示。作为一个概括的解决方案,我认为我至少可以通过两种方式完成任务

  • 编写一个涉及::where和->groupBy以及其他运算符的雄辩查询
  • (我选择的路径)构建一个数组数组
  • 无论哪种方式,结果都会发送回show blade页面

    问题

    使用每种方法的含义是什么?另外,传回一个集合(一个有说服力的查询的结果)是否真的意味着您正在将所有字段数据传递到前端,即使其中的大部分数据可能没有被使用

    我的想法包括:

  • 使用雄辩似乎更优雅,我认为(?)更有效。然而,当只需要其中的一个子集时,我似乎将传递对象及其所有数据
  • 与上述相反,构建数组意味着我必须手动编写代码,但我的数组只包含需要传递回前端的内容,仅此而已

  • 将整个结果集从数据库返回给请求者不是一个好的做法。你可以在一个非常小的项目中,或者在PoC中,或者在学习一些东西的时候这样做。在其他情况下,您需要一个层将结果从数据库转换为结果数据。这一层也很重要,因为很多时候DB的结果不是我可能需要返回的最终数据,所以我可能需要在返回之前进行一些数据处理/转换/替换。这一层是如何实现的——这取决于

    使用雄辩似乎更优雅,我认为(?)更有效。然而,当只需要其中的一个子集时,我似乎将传递对象及其所有数据

    这是快速和“肮脏”的,从长远来看会导致问题。正如您所提到的,集合是一个对象数组,集合实例本身是一个可遍历的对象,因此您需要一个中间件来将您的对象转换为可序列化的表示,以便laravel可以将其设置为响应。这可能已经在幕后为您完成了

    与上述相反,构建数组意味着我必须手动编写代码,但我的数组只包含需要传递回前端的内容,仅此而已

    这比较慢,但您可以控制返回的内容。如果您没有对这个转换层进行任何抽象,并且在一个控制器中完成该工作,那么从长远来看,它也会导致问题,因为维护和重构都很困难


    因此,使用抽象转换层的方法是最好的选择,但是是的,它需要在之前做一些额外的工作,这需要一些时间,但从长远来看会给您带来更好的结果。将整个结果集从数据库返回给请求者不是一个好的做法。你可以在一个非常小的项目中,或者在PoC中,或者在学习一些东西的时候这样做。在其他情况下,您需要一个层将结果从数据库转换为结果数据。这一层也很重要,因为很多时候DB的结果不是我可能需要返回的最终数据,所以我可能需要在返回之前进行一些数据处理/转换/替换。这一层是如何实现的——这取决于

    使用雄辩似乎更优雅,我认为(?)更有效。然而,当只需要其中的一个子集时,我似乎将传递对象及其所有数据

    这是快速和“肮脏”的,从长远来看会导致问题。正如您所提到的,集合是一个对象数组,集合实例本身是一个可遍历的对象,因此您需要一个中间件来将您的对象转换为可序列化的表示,以便laravel可以将其设置为响应。这可能已经在幕后为您完成了

    与上述相反,构建数组意味着我必须手动编写代码,但我的数组只包含需要传递回前端的内容,仅此而已

    这比较慢,但您可以控制返回的内容。如果您没有对这个转换层进行任何抽象,并且在一个控制器中完成该工作,那么从长远来看,它也会导致问题,因为维护和重构都很困难


    因此,使用抽象转换层的方法是最好的选择,但是是的,它需要一些额外的工作才能完成,这需要一些时间,但从长远来看会给您带来更好的结果

    最优雅的方法是使用
    资源
    将数据传递到前端。文档:最优雅的方法是使用
    资源
    将数据传递到前端。文档: