-
Notifications
You must be signed in to change notification settings - Fork 11k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
(regression) Impossilbe to use JsonResource::collection with paginated query (not eloquent) #29916
Comments
Laravel Version: 6.0.3 Same error with |
Yes, I'm experiencing the same problem. Any workaround? I can't update to Laravel 6 because of this. Is there any simple way of returning the same payload as the JsonResource would? |
For php 7.2/7.3 you can just copy
|
Thanks I’ll give it a try. Why only PHP 7.2 & 7.3 though? Implementing ArrayAccess was not an option as suggested in other issues since I’m returning a LengthAwarePaginator of a raw query, I don’t want to iterate over them just to create a new object 😅 |
Seems |
Have the same issue after upgrading from 5.7 to 5.8 I do not really know what to do now. Has anyone a workaround for this? Will this be fixed in future laravel solutions? |
Ok, I found the solution to my problem. |
This works for me on a fresh Laravel 5.8 installation: <?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class CustomResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return parent::toArray($request);
}
} Route::get('/', function () {
$result = \DB::table('users')->paginate();
return \App\Http\Resources\CustomResource::collection($result);
}); Since this has been fixed as well in Laravel 6.0 I want to ask you all to upgrade please. Thanks. |
@driesvints , I guess your use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\DB;
class CustomResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return get_object_vars($this->resource);
}
// Uncomment to fix
// public function offsetExists($offset) {
// return array_key_exists($offset, $this->resource);
// }
}
Route::get('/', function () {
DB::table('users')->insert([
'name' => 'test',
'email' => "test-".Str::random(10)."@example.com",
'password' => '',
]);
$result = DB::table('users')->paginate();
return CustomResource::collection($result);
}); |
@LastDragon-ru it wasn't empty |
@driesvints , mmmm... maybe related to fetch mode and/or database? Because framework/src/Illuminate/Http/Resources/Json/JsonResource.php Lines 112 to 121 in 2095b02
|
PHP 7.3.9 @driesvints Problem still exists |
I can confirm this issue is still present. PHP 7.2
We ended up adding this lines to our Resource
|
@LastDragon-ru I just realized this can't possible work because resources are eloquent specific. We don't support using it with the query builder. Because stdClass doesn't implements array access it doesn't work like that. See https://laravel.com/docs/6.x/eloquent-resources @stsepelin @Lloople Please see the above note. |
It's good for me, I just found a solution in minutes thanks to @GrahamCampbell, but I would appreciate a warning about this in the upgrade guide at the time or a clarification in the documentation 😅. Another inoffensive and naive question: If they were compatible with non-eloquent objects before, why removing that compatibility? |
@Lloople we didn't add an notice to the upgrade guide because there weren't breaking changes.
We had to make some adjustments for PHP 7.4 (see #29842). Unfortunately that removed the accidental support for the query builder. Btw, nothing says that we can't look into making it compatible again but that's a discussion for the ideas repo. |
This issue is not fixed |
@Nilanth See the comment directly above yours. Nothing to fix but could be discussed in the ideas repo. |
Restores php 7.4 compatibility for paginator resources that receives objects (for example from the query builder) instead of models. Fixes laravel#31703 and laravel#29916
to fix this issue if faced you for php 7.4 :
and i think it must be like this in laravel files:
I'm just saying |
- bug: laravel/framework#29916 - JSON API paginations were broken, (e.g. /api/banners)
Not working in Laravel 7.3 :-( |
- bug: laravel/framework#29916 - JSON API paginations were broken, (e.g. /api/banners)
Description:
Laravel 5.8.34:
Since 5.8.35:
actionWithoutPaginate
- works fineactionWithPaginate
- brokenRelated to #29858, #29860
The text was updated successfully, but these errors were encountered: