保护私人版权,尊重他人版权。转载请注明出处并附带页面链接
marco是什么
Laravel利用php的特性,实现了一套Macroable的Traits,因此引用了Macroable的类都可以用这个方法来扩展,如Response、Request、Collection。
项目背景
本文针对的是使用php的laravel框架。
实际遇到的问题
因业务抽离的原因,拆分了数据库实例,原先项目里一些多对多查询的查询因跨了实例无法用laravel的多对多relation实现。项目中model上层的调用处极多,需求要求短时间内改完。
解决思路
保持model上层调用的地方不变,在model层方法动手。把不能跨实例的多对多方法查询降级为框架支持的一对多或多对一的支持跨实例的查询。Laravel框架用的Eloquent ORM的get方法返回类型是Collection,想办法扩展Collection的功能。
简单的写法如下:
1 |
|
为了让整个项目都能使用,将marco的代码放在服务注册提供者里。
如下所示:
app.php里添加
1 | $app->register(App\Providers\CollectionMacroServiceProvider::class); |
1 | class CollectionMacroServiceProvider extends ServiceProvider |
反思
针对需要短时间内修改的需求场景下迫于选择了这种方式,其实更像是补丁的形式,更合理的是需要改上层的数据查询方式。