我使用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()
分页方法,懒惰的预先加载会失败。这意味着我必须始终查询所有付款。
如何对此查询进行分页?
编辑:表架构
答案 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
加载该用户的付款。