Laravel基于下级模型获取计数

时间:2018-12-10 15:58:44

标签: laravel eloquent

我正在尽最大努力弄清楚如何进行这项工作,但是我不确定采取正确的方法。我想跟踪一个药房的指标,特别是一个月内药房可以填充或补充多少患者。理想情况下,可以通过计算patients模型中scripts填充的fill_dateprescription的数量来实现。

例如,可以在1/1/18上将patient约翰·史密斯写成script,而在1/1 / 18、2 / 1/18上收到prescriptions 18年3月1日。我希望在我的指标中跟踪这些笔芯-但可以通过patientscript完成。这样我们就可以知道每月有多少患者(原始填充或替换填充)。

这是我的模型和关系的细分:

患者/脚本

patients有很多scripts,其中scripts只能有1个patient。患者就是您所期望的:医生的患者。他们通常去一次医生办公室,并为他们编写脚本。脚本是医生为患者编写的文件。他们将为患者编写并发送给药房。每个脚本都有一个prescribe_date,以显示患者何时为他们编写了脚本。

脚本/处方

scripts有很多prescriptions,其中prescriptions只能有1个script。当药房收到脚本时,他们会看到病人的保险可以承保的范围,然后填写处方。处方是患者被批准和接受​​的处方,如果他们为处方补充了处方,则可能会连续数月获得处方。每个处方都有一个fill_date,以显示他们何时收到填充/补充。

药房

pharmacies有很多scripts,其中scripts只能有1个pharmacy。药房是为编写的脚本添加标签的标识符,以便我们可以跟踪药房的指标。

这是我的代码:

药房模型(通过脚本关系链接处方)

// Pharmacies have many Scripts relationship
public function prescriptions() {
    $this->load(['scripts.prescriptions' => function($query) use (&$relation) {
        $relation = $query;
    }]);

    return $relation;
}

变量

$patients_current_month = $pharmacy
    ->prescriptions()
    ->whereBetween('fill_date', [$first_day_current_month, $last_day_current_month])
    ->count();

使用该方法,我可以每月获得药房的prescriptions总数,但是我尝试了多种方案,但找不到一种方法来显示该病患者的人数fill_date(根据他们的处方)。

1 个答案:

答案 0 :(得分:0)

脚本和Pre 脚本的意思相同。您不需要两个表。但是,如果您要查找患者用药计划允许的药物,则将需要“药物”表和“覆盖”数据透视表。您还将需要一个“库存”数据透视表。

我不会告诉您所有关系,因为我认为您可以自己弄清楚这些关系,这将使答案太长。我几乎所有的代码都是伪代码。

这是我想出的:

患者

id|name

处方

id|patient_id|doctor_id|is_filled|pharmacy_id|drug_id|reason|timestamps|

药物

id|name|timestamps

药房

id|name

库存

drug_id|pharmacy_id

覆盖率

patient_id|drug_id

请注意,您可以通过添加要与Pivot放在一起的其他内容来将表用作数据透视表。这对于您的“处方”表可能会派上用场。

//Patient.php
public function drugs()
{
    return $this->belongsToMany(Pharmacy::class, 'prescription')->withPivot('pharmacy_id');
}

//Gets how many prescriptions a patient has at pharmacy between dates
Patient::withCount(['prescription.drugs '=> function($query) use ($first_day_current_month, $last_day_current_month, $pharmacy_id){
    $query->where('pharmacy_id', $pharmacy_id);
    $query->whereBetween('created_at',[$first_day_current_month, $last_day_current_month]) //You can use whereBetween for dates
}])->get();

//Counts prescriptions filled by Pharmacy for a drug

Pharmacy::withCount(['drug' => function($query) use ($drug_id){
    $query->where('drug_id', $drug_id);
    //You can also count haw many drugs were sold at a pharmacy here 
    //and between what dates.
}])->get();

处方上的boolean字段已填充,使您能够查看患者是否正在填充。如果需要,可以将未填充的列设为0,将填充的列设为1,重新填充的列设为3。

我正在大量使用constraint eager loading来完成您想要的事情。