1. 问题阐述
laravel通过数据库查询数据后,数据类型既包含数组又包含对象,前端渲染的时候非常麻烦,很容易会把对象当成数组类型去调用,如果可以统一成数组的类型调用,将会非常方便。
Array
(
[menus] => Array
(
[0] => stdClass Object
(
[mid] => 3
[pid] => 0
[ishidden] => 0
[ord] => 0
[status] => 0
[icon] =>
[title] => 管理账号
[controller] => admin
[action] =>
[child] => Array
(
[0] => stdClass Object
(
[mid] => 4
[pid] => 3
[ishidden] => 0
[ord] => 0
[status] => 0
[icon] =>
[title] => 账号列表
[controller] => admin
[action] => index
)
)
)
)
)
2. 解决方案
2.1 不建议的方法
直接修改larvel框架DB定义的类,在类里面增加一个方法实现。
2.2 通过扩展集合继承
2.2.1 理论支撑
在不影响系统原先的代码,自定义一个文件拓展DB类实现自己想要的目的。集合都是可宏扩展(macroable
) 的,它允许你在执行时将其它方法添加到Collection
类。例如,通过下面的代码在 Collection
类中添加一个toUpper
方法:
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
Collection::macro('toUpper', function () {
return $this->map(function ($value) {
return Str::upper($value);
});
});
$collection = collect(['first', 'second']);
$upper = $collection->toUpper();
// ['FIRST', 'SECOND']
2.2 Database恰好符合
class Builder
{
use BuildsQueries, ForwardsCalls, Macroable {
__call as macroCall;
}
/**
* The database connection instance.
*
* @var \Illuminate\Database\ConnectionInterface
*/
public $connection;
...
2.3 自定义需要的功能
- 可以使用
artisan
创建一个provider
,指令php artisan make:provider DBServiceProvider
;use引入需要扩展的命名空间下的类,根据格式要求定义自己的方法。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Database\Query\Builder as QueryBuilder;
class DBServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
QueryBuilder::macro('lists',function() {
// echo 'www.aoebbs.cn';
$data= $this->get()->all();
$result=[];
foreach($data as $val) {
$result[]=(array)$val;
}
return $result;
});
}
}
2.4 注册到laravel
config
目录下的app.php
,添加App\Providers\DBServiceProvider::class,
2.5 调用方法和结果
- 直接使用自定义的lists方法
$data['admins']=DB::table('admin')->lists();
echo '<pre>';
print_r($data['admins']);
Array
(
[0] => Array
(
[id] => 1
[name] => lin123458
[password] => 07894c5f5ae76e45c452f69ebfe3fd58
[time] => 2020-06-07 10:45:24
[ip] => 178.221.141.246
[groupbox] => system,gamegl,gametj,adgl,adff,adtj,jpgl,djgl,users,sms,hdgl,bbs,business,card,pay,dbgl,admingl
)
[1] => Array
(
[id] => 2
[name] => admin
[password] => 07894c5f5ae76e45c452f69ebfe3fd58
[time] => 2020-06-07 10:45:24
[ip] => 178.221.141.249
[groupbox] => system,gamegl,gametj,adgl,adff,adtj,jpgl,djgl,users,sms,hdgl,bbs,business,card,pay,dbgl,admingl
)
)
3. 总结
底层原理任然是利用了php里面的trait特性,实现一个特定的功能类,这个功能类作为一个拓展,继承原来框架的功能基础上实现自己的目的。