在laravel找不到可用的献血者


Can't get available blood donors in laravel

我正在为我的大学网站做一个BDS(献血协会)的功能。现在我面临着一个问题,获得可用的献血者,即过去3个月或6个月没有献血的献血者。下面是我的代码:

供体类如下:

protected $fillable = [
    'name',
    'email',
    'address',
    'area',
    'mobile',
    'blood_group',
];
public function getLastDonation()
{
    return DonorRecord::all()->where('donor_id',$this->id)->pluck('donation_date');
}
public function getAvailableDonors()
{
    $current = Carbon::now();
    return Donor::all()->where($this->getLastDonation(),'<=',$current->addMonths(3));
}

下面是我的控制器代码:

public function allDonors()
{
    $donors = Donor::getAvailableDonors();
    return view('BDS/allDonors',compact('donors'));
}

现在我知道我在静态地调用一个非静态方法,但我不知道如何绕过它。

我想要实现的是找到最近3个月没有献血的献血者,并将其发送到视图。同样在getLastDonation()方法中,我不确定我是否使用了正确的查询。

下面是我的DonorRecord模型/类

protected $fillable = [
    'donor_id',
    'donation_date',
    'receiver_name',
    'receiver_mobile',
    'location',
    'city',
    'reason'
];

由于声誉不高,我无法评论,一如既往,有很多方法可以做到这一点。

但是假设你有捐赠者和捐赠者记录之间的关系,我就会这样做。

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'));
}
编辑:

作用域允许您预定义常用查询,以节省您在控制器和代码的其他区域重复编写它们的时间。

使用a作用域只是对你现有的查询应用约束,所以像上面那样使用它就像写,

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();

执行相同的操作,但是从供体端而不是供体记录端执行。