分页资源失败

时间:2019-10-17 06:18:47

标签: laravel

我有此资源:

class Job extends JsonResource
{
    public function toArray($request)
    {
         // the quantity of branch this job belongs to
        $branchesQuantity = BranchJob::where('job_id', $this->id)->count();

    // the quantity of countries this job belons to
    $countriesQuantity = JobCountry::where('job_id', $this->id)->count();

    // the translations of the job
    $jobTranslations = JobTranslation::where('job_id', $this->id)
       ->select('id', 'language_id', 'external_translation', 'internal_translation')->orderBy('language_id')->get();

    return [
        'id' => $this->id,
        'short_name' => $this->short_name,
        'status' => $this->status,
        'branches_quantity' => $branchesQuantity,
        'countries_quantity' => $countriesQuantity,
        'job_translations' => $jobTranslations
    ];
}
}

这是我控制器中的代码:

$queryJob = DB::table('jobs as j')
    ->join('job_translations as jt', 'j.id', 'jt.job_id');

...其他一些代码

$jobs = $queryJob->get();
        return JobResource::collection($jobs);

它工作正常。它返回正确的json。完善。

我想对结果进行分页,所以我用:

修改了查询。
    $jobs = $queryJob->paginate($qtyItemsPerPage);
return JobResource::collection($jobs);

我遇到此错误:

  

Symfony \ Component \ Debug \ Exception \ FatalThrowableError:无法使用   类型为stdClass的对象作为文件中的数组   /srv/api/vendor/laravel/framework/src/Illuminate/Http/Resources/DelegatesToResource.php   在第53行

并且不理解为什么没有分页就可以工作,也不能与分页一起工作。谢谢你的帮助。唐

3 个答案:

答案 0 :(得分:0)

  

Laravel分页器结果类实现了   照亮\合同\支持\合理的接口合同并公开   toJson方法,因此转换分页非常容易   结果转换为JSON。

https://laravel.com/docs/5.4/pagination#converting-results-to-json

因此您可以使用

return $queryJob->paginate($qtyItemsPerPage);

Laravel为集合提供forPage(),但是它是低级的。

https://laravel.com/docs/5.4/collections#method-forpage

如果您的laravel版本低于5.5,则可以使用macro获得相同的paginate行为。

https://gist.github.com/simonhamp/549e8821946e2c40a617c85d2cf5af5e

如果版本5.5 =>,则可以将分页程序实例传递给资源的收集方法或自定义资源收集。

https://laravel.com/docs/5.5/eloquent-resources#pagination

答案 1 :(得分:0)

根据documentation,您需要先获取分页结果,然后转换为资源集合

use App\User;
use App\Http\Resources\UserCollection;

Route::get('/users', function () {
    return new UserCollection(User::paginate());
});

这样您就可以使用

$jobs = $queryJob->paginate(10);
return JobResource::collection($jobs);

答案 2 :(得分:0)

我使用传统的查询生成器解决了该问题。而不是雄辩的查询。由于现在工作正常,所以没有找到其他解决方案。 Dom