博客列表 >laravel自定义扩展类实现查询数据统一数组输出

laravel自定义扩展类实现查询数据统一数组输出

我是郭富城
我是郭富城原创
2020年06月10日 18:55:081617浏览

1. 问题阐述

laravel通过数据库查询数据后,数据类型既包含数组又包含对象,前端渲染的时候非常麻烦,很容易会把对象当成数组类型去调用,如果可以统一成数组的类型调用,将会非常方便。

  1. Array
  2. (
  3. [menus] => Array
  4. (
  5. [0] => stdClass Object
  6. (
  7. [mid] => 3
  8. [pid] => 0
  9. [ishidden] => 0
  10. [ord] => 0
  11. [status] => 0
  12. [icon] =>
  13. [title] => 管理账号
  14. [controller] => admin
  15. [action] =>
  16. [child] => Array
  17. (
  18. [0] => stdClass Object
  19. (
  20. [mid] => 4
  21. [pid] => 3
  22. [ishidden] => 0
  23. [ord] => 0
  24. [status] => 0
  25. [icon] =>
  26. [title] => 账号列表
  27. [controller] => admin
  28. [action] => index
  29. )
  30. )
  31. )
  32. )
  33. )

2. 解决方案

2.1 不建议的方法

直接修改larvel框架DB定义的类,在类里面增加一个方法实现。

2.2 通过扩展集合继承

2.2.1 理论支撑

在不影响系统原先的代码,自定义一个文件拓展DB类实现自己想要的目的。集合都是可宏扩展(macroable) 的,它允许你在执行时将其它方法添加到Collection类。例如,通过下面的代码在 Collection 类中添加一个toUpper方法:

  1. use Illuminate\Support\Collection;
  2. use Illuminate\Support\Str;
  3. Collection::macro('toUpper', function () {
  4. return $this->map(function ($value) {
  5. return Str::upper($value);
  6. });
  7. });
  8. $collection = collect(['first', 'second']);
  9. $upper = $collection->toUpper();
  10. // ['FIRST', 'SECOND']

2.2 Database恰好符合

  1. class Builder
  2. {
  3. use BuildsQueries, ForwardsCalls, Macroable {
  4. __call as macroCall;
  5. }
  6. /**
  7. * The database connection instance.
  8. *
  9. * @var \Illuminate\Database\ConnectionInterface
  10. */
  11. public $connection;
  12. ...

2.3 自定义需要的功能

  • 可以使用artisan创建一个provider,指令php artisan make:provider DBServiceProvider;use引入需要扩展的命名空间下的类,根据格式要求定义自己的方法。
  1. <?php
  2. namespace App\Providers;
  3. use Illuminate\Support\ServiceProvider;
  4. use Illuminate\Database\Query\Builder as QueryBuilder;
  5. class DBServiceProvider extends ServiceProvider
  6. {
  7. /**
  8. * Register services.
  9. *
  10. * @return void
  11. */
  12. public function register()
  13. {
  14. //
  15. }
  16. /**
  17. * Bootstrap services.
  18. *
  19. * @return void
  20. */
  21. public function boot()
  22. {
  23. QueryBuilder::macro('lists',function() {
  24. // echo 'www.aoebbs.cn';
  25. $data= $this->get()->all();
  26. $result=[];
  27. foreach($data as $val) {
  28. $result[]=(array)$val;
  29. }
  30. return $result;
  31. });
  32. }
  33. }

2.4 注册到laravel

  • config目录下的app.php,添加App\Providers\DBServiceProvider::class,

2.5 调用方法和结果

  • 直接使用自定义的lists方法
  1. $data['admins']=DB::table('admin')->lists();
  2. echo '<pre>';
  3. print_r($data['admins']);
  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [id] => 1
  6. [name] => lin123458
  7. [password] => 07894c5f5ae76e45c452f69ebfe3fd58
  8. [time] => 2020-06-07 10:45:24
  9. [ip] => 178.221.141.246
  10. [groupbox] => system,gamegl,gametj,adgl,adff,adtj,jpgl,djgl,users,sms,hdgl,bbs,business,card,pay,dbgl,admingl
  11. )
  12. [1] => Array
  13. (
  14. [id] => 2
  15. [name] => admin
  16. [password] => 07894c5f5ae76e45c452f69ebfe3fd58
  17. [time] => 2020-06-07 10:45:24
  18. [ip] => 178.221.141.249
  19. [groupbox] => system,gamegl,gametj,adgl,adff,adtj,jpgl,djgl,users,sms,hdgl,bbs,business,card,pay,dbgl,admingl
  20. )
  21. )

3. 总结

底层原理任然是利用了php里面的trait特性,实现一个特定的功能类,这个功能类作为一个拓展,继承原来框架的功能基础上实现自己的目的。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议