我是Laravel的新手, 但我不认为我写的是优化的代码. 我想把所有逾期的发票按客户分开. 发票表和客户表. client_id在发票表里. 我有下面的,但我想知道是否有更好的方法。我还想从客户表中抓取客户名称。我已经创建了一个数组,这样我就可以在视图文件中相应的循环,但同样我不确定这是正确的方法?
$overdueClients = Invoice::where("date_paid",'0000-00-00')->where("date_due","<=",date("Y-m-d"))->pluck('client_id');
foreach($overdueClients as $overdueClient)
{
$invoices = Invoice::select("title","total","on_account","date","date_due")->where("date_paid",'0000-00-00')->where("date_due","<=",date("Y-m-d"))->where('client_id',$overdueClient)->get();
$return[$overdueClient][] = $invoices;
}
return $return;
试试这个
$return = Invoice::select("title","total","on_account","date","date_due","client_id")->where("date_paid",'0000-00-00')->where("date_due","<=",date("Y-m-d"))->get();
return $return;
是的,幸运的是,有一个更好的方法,哪个术语叫 "更好的方法"?relations
并可以使用急切加载,所以你可以做的是使关系是模型第一:所以在你的。Invoice
你写的东西像下面。
public function users(){
return $this->belongsTo('App/Users');
}
你应该根据你的模型和用户模型的名称和路径来固定上述关系。
public function invoices(){
return $this->hasmany('App/Invoices');
}
所以现在一张发票属于一个用户和一个 user
可以有许多发票.当你需要得到用户有发票和逾期的发票,你做像下面。
$users = Invoices::with('users')->where("date_paid",'0000-00-00')->where("date_due","<=",date("Y-m-d"));
这是更好的方式来行动,因为防止n+1问题,这种方式,你只加载用户,如果他们有逾期的发票,如果没有,他们没有被加载在所有看看下面的文档。
https://laravel.com/docs/7.x/eloquent-relationships#introduction
我强烈建议你花时间阅读并实践它,因为当你想使用laravel时,你会比你想象的更需要它.希望这能帮助到你.