Laravel踩坑总结(一)一次优化数据传输引发的问题

今天在给公司网站做数据传输优化时发现下列的API请求:只是一个简单的点赞动作,传输许多不重要的结果信息。

image.png

先找到commabley以及user被加载的地方,并把它去除:

下图是controller中的处理方法

image.png

进入toggleLike()方法

image.png

event()触发了Like被创建的时间监听,来看看事件处理方法:

image.png

再次回到我们最初的问题:先找到commentable以及user被加载的地方。但是观察这些代码并没有发现 预加载方法的出现(没有with(),没有load())。但是结果却向我们证明是不是要换一种思考方式。

观察发现,如下图:

image.png

这时,突然想起了动态属性的特性: Laravel与GraphQL有个约会(四)-数据库名与模型方法重名问题

动态属性有一张这样的方法调用:

下面方法位于Illuminate\Database\Eloquent\Concerns\HasAttributes.php:

image.png

进入setRelation()方法:

image.png

在使用动态属性时,会将关联关系附加在model上返回。所以也就出现:没有预加载关联关系,为什么还是返回了关联结果。因为我们调用了commentable以及user,而他们都是动态属性。

如果是预加载可以传递闭包排除不相关的数据列:

image.png

但是此种情况我还没有找到比较完美的解决方案: 框架中有一个unsetRelation(),应该是一个解决方向。 如果研究出来会继续追更。

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容