Laravel踩坑总结(一)一次优化数据传输引发的问题
今天在给公司网站做数据传输优化时发现下列的API请求:只是一个简单的点赞动作,传输许多不重要的结果信息。
先找到commabley以及user被加载的地方,并把它去除:
下图是controller中的处理方法
进入toggleLike()方法
event()触发了Like被创建的时间监听,来看看事件处理方法:
再次回到我们最初的问题:先找到commentable以及user被加载的地方。但是观察这些代码并没有发现 预加载方法的出现(没有with(),没有load())。但是结果却向我们证明是不是要换一种思考方式。
观察发现,如下图:
这时,突然想起了动态属性的特性: Laravel与GraphQL有个约会(四)-数据库名与模型方法重名问题
动态属性有一张这样的方法调用:
下面方法位于Illuminate\Database\Eloquent\Concerns\HasAttributes.php:
进入setRelation()方法:
在使用动态属性时,会将关联关系附加在model上返回。所以也就出现:没有预加载关联关系,为什么还是返回了关联结果。因为我们调用了commentable以及user,而他们都是动态属性。
如果是预加载可以传递闭包排除不相关的数据列:
但是此种情况我还没有找到比较完美的解决方案: 框架中有一个unsetRelation(),应该是一个解决方向。 如果研究出来会继续追更。
写下、记下、留下