为什么对 collection 集合使用 push 等方法操作完,再传到 transformer 里面就不是一个集合了呢?

使用了dingo第三方库中的transformer

我使用Eloquent获取数据,得到一个集合,之后我又通过 $collection->push(['city' => 'Beijing','sales' => 234]); 手动添加了一组合并到集合,然后使用dingo的transformer,本来穿过去应该是一个集合,可是为什么变成了一个array? 是调用 push的时自动转变的么? 求大神指点。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 7
Kurisu

collection push进去是不会改变成array的,这一点可以直接 dump($collection->push(['city' => 'Beijing','sales' => 234])) 验证,

6年前 评论

@Kurisu 恩恩,谢谢,确实是这样的,它始终是一个 object,但是在调用的时候却出了问题,
他只能这样调用

public function transform($data)
{
     var_dump($data);//返回是一个object,但却只能想下面这样取值
     return [
            'x' => $data['x'],
            'y' => $data['y']
        ];
}

而不是 像我之前的用法

public function transform($data)
{
     return [
            'x' => $data->x,
            'y' => $data->y
        ];
}

所以这是我纠结的地方

6年前 评论

@Kurisu 我只知道,当直接通过eloquent orm 获取到的集合,自己不对集合做操作时,传到 transformer中可以通过'x' => $data->x, 这样去获取值,但是只要对查询到的集合自己做一下处理,当传到transformer中 这样'x' => $data->x,就会报错,就只能通过 'x' => $data['x'], 这种方式了

6年前 评论
Kurisu

我尝试了一个这样的例子

public function testA()
{
$colloction = collect([ 'a' => 1 , 'b' => 2]);
dump($collection);
$collection->put('c',3);
dump($collection);
dump($collection['a']);
dump($collection->a);
dump(User::all()->first());
}

而到$collection->a会报错,
->这个符号的意思是调用$collection里的某个方法或者属性,
我猜测是User类的实例有 _get 这种拦截器魔术方法,在未被定义的属性被调用时触发,返回调用的某个属性,而这种自己put进去的没有这个方法

6年前 评论

@Kurisu 非常感谢您,我自己也是试了一下,只要我对模型获取的到的集合进行操作,那个集合就会变成 Illuminate\Database\Eloquent\Collection下面的,然而,我不对模型获取的到的集合进行操作时,他就是 App\Models\CitySales下面的,所以应该就像您所说的是是Model类下的问题

6年前 评论
Kurisu

@Wanzj 能有所帮助就好:joy: 没有办法像大神那样从源码层面讲清楚为什么不行:joy:

6年前 评论

@Kurisu 哈哈,没有没有,是你给我点明了方向了,至少知道了是什么问题,:yum: :yum: :yum:

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!