Как использовать коллекцию ресурсов toArray и DB (без Eloquent) - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть этот запрос (в хранилище, без использования eloquent):

    public function getUsersOfASchool($schoolId, $request)
    {

        $query = DB::table('school_users as su')
            ->join('users as u', 'u.id', 'su.user_id')
            ->where('su.school_id', $schoolId);

        $users = $query->paginate();

        return $users;
    }

У меня есть этот контроллер:

try{
        $users = $this->userRepository->getUsersOfASchool($school->id, $request->all());
    } catch(\Exception $e) {
        return response()->json(['message'=>'Bad request '.$e->getMessage()], 400);
    }

    return new UserCollection($users);

И, по крайней мере, у меня есть эта коллекция:

public function toArray($request)
{
    return parent::toArray($request);
}

У меня есть эта ошибка 500:

"message": "Вызов неопределенного метода stdClass :: toArray ()",

I думаю, это потому, что я использую фасад 'DB' вместо Eloquent. Так как же работать с фасадом и коллекцией DB?

Merci

1 Ответ

1 голос
/ 02 февраля 2020

Да, потому что построитель запросов возвращает коллекцию с классом stdClass.

И ResourceCollection * Метод 1006 * toArray отобразит коллекцию, затем запустите toarray() на стандартный класс. Так происходит ошибка.

Однако коллекция eloquent Builder отобразит коллекцию, запустив toArray() для объекта модели. И этот объект имеет toArray() метод.

Вот исходный код :

    /**
     * Transform the resource into a JSON array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return $this->collection->map->toArray($request)->all();
    }

Таким образом, вы можете переписать метод toArray() для построителя запросов в вашем ресурсе:

public function toArray($request)
{
    // return parent::toArray($request);

    $collection = $this->collection;
    if (method_exists($collection->map, 'toArray')) {
        return $collection->map->toArray($request)->all();
    } else {
        // for stdClass
        return json_decode(json_encode($collection, true), true);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...