无法在laravel中获得献血者

时间:2016-08-25 22:59:17

标签: php laravel eloquent

我正在为我的大学网站制作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

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

从捐助方而非捐助方记录方面做同样的事情。