Laravel口才请求中的比较属性

时间:2018-07-31 21:24:05

标签: laravel laravel-5 eloquent

我有一个控制器功能,我想将模型中的字段与该模型的属性进行比较,并像下面这样在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');
    }

还是有更好的方法来解决此问题?我只是想过滤出余额大于已付款或根本没有付款的机票。

谢谢!

1 个答案:

答案 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()的调用您的索引(因为过滤可以将其保留下来,所以也可以留有任何空白)。