我正在为我的大学网站制作BDS(献血协会)功能。现在我面临一个问题,即获得可用的捐赠者,即在过去3个月或6个月内没有捐献血液的捐赠者。以下是我的代码:
捐助者课程如下:
public function allDonors()
{
$donors = Donor::getAvailableDonors();
return view('BDS/allDonors',compact('donors'));
}
以下是我的控制器代码:
protected $fillable = [
'donor_id',
'donation_date',
'receiver_name',
'receiver_mobile',
'location',
'city',
'reason'
];
现在我知道我静态地称之为非静态方法,但我不知道如何绕过它。
我愿意做的是让捐赠者在过去3个月内捐献血液并将其送到视野中。同样在方法getLastDonation()中,我不确定我是否使用了正确的查询。
以下是我的DonorRecord模型/类。
192.168.0.1
答案 0 :(得分:2)
由于声誉低,我无法发表评论,因为总有很多方法可以做到这一点。
但假设您与捐赠者和捐赠者记录之间存在关系,我会这样做。
DonorRecord:
public function scopeAvailableDonors($query)
{
//Making an assumption here that you wanted more than three months ago, not three months in the future;
$before = Carbon::now()->subMonths(3);
return $query->where('donation_date','<=', $before);
}
控制器代码:
public function allDonors()
{
$donors = DonorRecord::AvailableDonors()->get(); // Or even better DonorRecord::AvailableDonors->with('Donor')->get();
return view('BDS/allDonors',compact('donors'));
}
编辑:
范围允许您预定义常见查询,以避免在控制器和代码的其他区域重复编写它们。
使用范围只会对现有查询应用约束,因此像上面一样使用它与写作相同,
public function allDonors()
{
$donors = DonorRecord::where('donation_date','<=',Carbon::now()->subMonths(3));
return view('BDS/allDonors', compact('donors'));
}
它只允许您将逻辑移出控制器并进入模型,如果它不常用,可能不合适,因为它会使您的模型混乱(如果您使用大量的模型)。
以前,您尝试将非静态方法作为静态方法调用并引用$ this,$ this在静态上下文中不存在。
同样在你的控制器中你可以做到这一点:
App\Donor::with(['donorrecord' => function ($query) {
$query->where('donation_date', '<=', Carbon::now()->subMonths(3));
}])->get();
从捐助方而非捐助方记录方面做同样的事情。