Laravel懒惰的渴望加载与分页

时间:2014-03-24 21:34:56

标签: php laravel eloquent

我使用Laravel's Eloquent的懒惰渴望加载功能首先查询一些payments,然后使用{{急切地将payers加载到每个payment中1}}。

澄清: ->load()

以下是我使用的代码(需要一段时间才弄明白但是有效)

users hasMany payers hasAndBelongsToMany payments

目前,该查询仅使用 //Get all the payments for the logged in user $payments = Payment::whereHas('payers', function($q){ $q->where('user_id', '=', Auth::user()->id); },'>=', DB::raw('1')) ->get(); //lazy eager load the pivot data, which contains payer info for each payment $payments = $payments->load(array( 'payers' => function($q){ $q->where('user_id', '=', Auth::user()->id); })); 来获取付款。如果我将其更改为get()它也可以工作,但由于没有paginate()分页方法,懒惰的预先加载会失败。这意味着我必须始终查询所有付款。

如何对此查询进行分页?

编辑:表架构 enter image description here

1 个答案:

答案 0 :(得分:2)

首先,根据我的原始答案,我仍然相信您可以改善初始查询。如果您希望找到所有Payments的用户,您应该能够通过简单的Eloquent关系来实现,而不是直接通过Payment模型使用更复杂的whereHas()语句。

其次,延迟预先加载的load()方法实际上附加到Illuminate\Database\Eloquent\Collection类。这就是缺少的东西,并阻止你的延迟加载工作。

如果你拥有到懒惰的急切加载(急切加载在初始查询中可以正常工作,有或没有分页),你会想要将Paginator的项目包装在该集合中。

$paginator = Auth::user()->payments()->paginate(10);

$payments = new Illuminate\Database\Eloquent\Collection($payments->getItems());
$payments->load('payer');

(注意:未经测试!)

基本上你是将Paginator中的项目复制到它自己的新系列中。假设您想要生成的页面链接以及加载的集合,您将希望将两个变量都传递给视图。

Paginator确实有setItems()方法可以覆盖原始项目数组,但我不知道它将如何影响其余的Paginator方法。请谨慎使用。


原来的错误答案:

您似乎只为单个用户加载付款。当只有一个人,已经拥有通过Auth::user()时,为什么需要急切地加载每个付款人?

理想情况下,您的payments()模型之间存在User关系,您只需通过Auth::user()->payments加载该用户的付款。