在Laravel框架中,数据操作是通过Eloquent ORM或者查询构建器(Query Builder)来实现的。Laravel5.5是Laravel框架的一个版本,它允许开发者通过简洁的语法对数据库进行操作。通常,在使用查询构建器时,开发者会使用`DB::table()->get()->toArray()`这样的链式调用,将结果集转化为数组。但是,有时候开发者可能对结果集的数组格式有特别的需求。
本文作者是一位对ThinkPHP框架有较深了解的PHP开发人员,他在使用Laravel5.5时遇到了一些困惑。他觉得在Laravel中,通过`DB::table()->select()->get()->toArray()`获取的结果集并不符合他的预期,与他习惯的ThinkPHP中的`select()`方法返回的数组格式有差异。因此,他决定对此进行修改。
为了尽量保持对原有框架影响最小,作者并没有直接修改`toArray`方法,而是新增了一个方法`getList`来替代`toArray`。在`vendor/laravel/framework/src/Illuminate/Support/Collection.php`文件中的`toArray`方法下,作者加入了`getList`方法,其具体实现是通过`array_map`和`get_object_vars`函数将集合中的每个对象的属性转换为数组。
`get_object_vars`函数用于获取对象的属性并返回一个包含属性名和属性值的关联数组。而`array_map`函数则对集合中的每一个对象应用`get_object_vars`函数,这样就可以将一个对象集合转换成一个数组集合。
具体代码实现如下:
```php
public function getList(){
return array_map('get_object_vars', $this->items);
}
```
之后,开发者便可以在使用查询构建器获取结果集后调用`getList()`方法,以获得期望的数组格式。
示例代码如下:
```php
$goods_category_list = DB::table('lara_goods_category')
->select('goods_category_id', 'goods_category_name', 'goods_category_shortname')
->where('goods_category_show', '=', 1)
->offset(0)
->limit(5)
->orderBy('goods_category_sort', 'asc')
->get()
->getList();
```
通过上述修改,作者得到的`$goods_category_list`变量将包含符合其预期格式的数组。尽管作者认为使用`get()->getList()`略显不雅,但目前看来这是一个可行的解决方案。当然,这种方法在一定程度上改变了Laravel框架的一些默认行为,因此在团队协作或者维护项目时可能会带来一些问题。如果有更好的解决方案或者Laravel的新版本能够提供更加灵活的配置,那么这种修改方法可能就不是最佳选择。
本文通过一个实例向我们展示了解决特定问题的思路和方法,即在Laravel框架的现有基础上通过增加自定义方法来解决特定的数据处理需求。同时,这也给我们一个启示:在不同框架间迁移时,我们可能需要适应框架提供的不同方法和习惯,但也可以通过扩展和修改来让新框架更适合我们的开发习惯。