在我的应用程序中,我一直在使用Eloquent查询的结果并通过变换器引导它并且它运行良好。这就是我在做的事情:
public function index()
{
$users = User::with('profile', 'location', 'role')->get();
return $this->respond([
'data' => $this->userTransformer->transformCollection($users->all())
]);
}
但是,我遇到了生成我需要使用DB :: RAW查询的嵌套资源的情况
public function byLoan($id)
{
$users = DB::select( DB::raw("SELECT * FROM users WHERE id IN (SELECT DISTINCT(user_id) FROM farms WHERE user_id = {$id})") );
return $this->respond([
'data' => $this->userTransformer->transformCollection($users->all())
]);
}
上面的代码给了我这个错误“Symfony \ Component \ Debug \ Exception \ FatalErrorException(E_ERROR)调用数组上的成员函数all()”。
我将transformCollection($ users-> all())更改为transformCollection($ users),现在错误是“Symfony \ Component \ Debug \ Exception \ FatalErrorException(E_ERROR)”不能使用stdClass类型的对象作为数组“
我不知道还有什么可以尝试。
我的Transformer类看起来像这样:
<?php namespace Acme\Transformers;
abstract class Transformer {
public function transformCollection(array $items)
{
return array_map([$this, 'transform'], $items);
}
public abstract function transform($item);
}
UserTransformer实施:
<?php namespace Acme\Transformers;
class UserTransformer extends Transformer
{
public function transform($arr)
{
//return $arr;
return [
'id' => $arr['id'],
'username' => $arr['username'],
'abr' => $arr['abr'],
'email' => $arr['email'],
'phone' => $arr['phone'],
'role_id' => $arr['role_id'],
'role_abr' => $arr['role']['abr'],
'role' => $arr['role']['role'],
'loc_id' => $arr['location']['id'],
'loc_abr' => $arr['location']['loc_abr'],
'region_id' => $arr['location']['region_id'],
'is_admin' => (boolean) $arr['is_admin'],
'is_manager' => (boolean) $arr['is_manager'],
'show_agency' => (boolean)$arr['profile']['show_agency'],
'show_balance_due' => (boolean)$arr['profile']['show_balance_due'],
'show_close_date' => (boolean)$arr['profile']['show_close_date'],
'show_commit_arm' => (boolean)$arr['profile']['show_commit_arm'],
'show_region' => (boolean)$arr['profile']['show_region'],
'show_season' => (boolean)$arr['profile']['show_season']
];
}
}
答案 0 :(得分:0)
首先,请勿在{{1}}上使用all()
。 select方法在调用后立即执行查询。 DB::select
仅适用于Eloquent模型。
然而,更大的问题是如何构建查询构建器结果。它是一个(所有行)数组(填充了对象)(单个行,每列有属性)
这意味着,将其传递给您的transform方法,然后像关联数组一样访问列不起作用。例如:
all()
你需要做的是:
$arr['id']
如果这会弄乱$arr->id // obviously the name $arr doesn't make any sense now because its an object..
的其他用法,那么只需添加
transform()
在函数的开头。这会将对象转换为数组,并确保您可以像$arr = (array) $arr;