Laravel 4.2:不能将Transformer与DB :: Raw Query一起使用

时间:2014-11-15 17:14:41

标签: laravel laravel-4

在我的应用程序中,我一直在使用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']
        ];
    }
}

1 个答案:

答案 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;

那样访问它