哈Ha!
我坐了一次,试图给前端JSON提供房地产,因为房地产有很多依赖性。 Symfony 4,knp分页和JMSSerializer原则上是标准的东西,但是问题是,当您尝试给一个包含所有嵌套实体和集合的对象时,在此数据的序列化级别上一切都开始变慢。
首先,您需要向数据库发出请求,然后序列化程序将逐步提取其他所有内容,然后将其全部包装为JSON,然后一切都将返回到最前端。
主意
我有一个主意,为什么不直接从数据库直接从后端返回JSON,是的,您需要编写出色的SQL,但是您可以创建一个工具来完成此任务。 我开始基于想法,OneToOne,ManyToOne,OneToMany和ManyToMany通信的数据模型编写一个想法, 在github上建立一个存储库 。 同样,此工具可以轻松地固定到Symfony 4上,并且可以对其进行自我配置,因此,您只需要注入QueryBuilderFactory工厂,然后按实体类从那里的QueryBuilder获取所需表。
我的序列化器还使用可以在实体字段上使用Expose注释设置的序列化组,不要忘记将Table注释附加到实体并指定表别名,最好使用通常指定的序列化组。
SQL生成示例
<?php use \Mash\MysqlJsonSerializer\QueryBuilder\Table\JoinStrategy\FieldStrategy; use \Mash\MysqlJsonSerializer\Wrapper\FieldWrapper; use \Mash\MysqlJsonSerializer\QueryBuilder\Table\Table; use \Mash\MysqlJsonSerializer\Wrapper\Mapping; use \Mash\MysqlJsonSerializer\QueryBuilder\QueryBuilder; $oneToManyTable = (new Table('advert_group', 'adg', 'adg_id')) ->addSimpleField('adg_id') ->addSimpleField('adg_name') ; $table = (new Table('estate', 'est', 'est_id')) ->addSimpleField('est_id') ->addSimpleField('est_name') ->addOneToManyField($oneToManyTable, 'advert_groups', new FieldStrategy('adg_estate')); $mapping = new Mapping(); $mapping ->addMap($table, 'est_id', 'id') ->addMap($table, 'est_name', 'name') ->addMap($oneToManyTable, 'adg_id', 'id') ->addMap($oneToManyTable, 'adg_name', 'name'); $builder = new QueryBuilder($table, new FieldWrapper($mapping)); $builder ->setOffset(2) ->setLimit(1); $sql = $builder->jsonArray();
结果,将生成以下SQL:
SELECT JSON_ARRAYAGG(JSON_OBJECT('id',est_res.est_id,'name',est_res.est_name,'advert_groups',(SELECT JSON_ARRAYAGG(JSON_OBJECT('id',adg.adg_id,'name',adg.adg_name)) FROM advert_group adg INNER JOIN estate est_2 ON est_2.est_id = adg.adg_estate WHERE est_2.est_id = est_res.est_id))) FROM (SELECT * FROM estate est LIMIT 1 OFFSET 2) est_res
结果:
[{"id": 3, "name": ", , 31", "advert_groups": [{"id": 10, "name": "avito-1115362430"}]}]
总结
完整的使用说明将很快添加到github存储库中。 结果,当我将其拧紧到项目中时,我收到了来自REST API的快速答复,与此同时,我能够返回很多具有大量嵌套依赖项的对象,例如,我想通过JMSSerializer获得40秒的信息,现在230毫秒,这提供了Kernel Subscriber通过反射读取实体字段上的注释的功能,我想很快通过缓存Symfony来实现。
该文章将得到补充...
第二部分