我有一个控制器功能,我想将模型中的字段与该模型的属性进行比较,并像下面这样在where
中使用它,这可能吗?
$ticketsOpen = Ticket::where([
['balance','>','paidBalance'],
['bill_to', $customer->id]
])
->whereNotIn('shipment_billing_status', [2,3])
->orderBy('created_at','desc')->get();
在这种情况下,上面的“ paidBalance”是在模型中引用的:
public function getPaidBalanceAttribute(){
$paid = $this->paymentDistributions->pluck('amount');
$paidBalance = $paid->sum();
return $paidBalance;
}
而paymentDistributions
则是指:
public function paymentDistributions(){
return $this->hasMany('App\Payments_Distribution', 'ticket_id','id');
}
还是有更好的方法来解决此问题?我只是想过滤出余额大于已付款或根本没有付款的机票。
谢谢!
答案 0 :(得分:1)
否,您不能在Eloquent Accessor内使用Query Builder。
当访问器由您的网络服务器执行时,查询生成器会为您的数据库准备一条语句(在调用get
方法时执行)。根据检索到的数据创建模型后,例如nginx。
解决问题的最简单方法是在检索到数据后对客户的票证执行filter
。
$ticketsOpen = Ticket::where('bill_to', $customer->id)
->whereNotIn('shipment_billing_status', [2,3])
->orderBy('created_at', 'desc')
->get()
->filter(function (Ticket $ticket){
return $ticket->balance > $ticket->paidBalance;
});
请记住,您可能希望根据数据量(->with('paymentDistributions')
eager load进行付款分配,并且如果需要重设,请在最后包含对->values()
的调用您的索引(因为过滤可以将其保留下来,所以也可以留有任何空白)。