简体   繁体   English

Laravel / LaraCSV管理复杂关系

[英]Laravel/LaraCSV Managing Complex Relationships

I'm running into some issues with my Collection/Model relationships with regards to LaraCSV. 关于LaraCSV,我的收藏/模型关系遇到了一些问题。 Here is its documentation: https://github.com/usmanhalalit/laracsv#full-documentation . 这是其文档: https : //github.com/usmanhalalit/laracsv#full-documentation I have 3 models that interact right now: Doctor, Patient, Script 我现在有3个可以互动的模型:医生,患者,脚本

Doctor belongsToMany Patient
Patient belongsToMany Doctor

Patient hasMany Script
Script belongsTo Patient

I also created a relationship link inside of my Doctor model that can be used to tie Doctor to Script, but does not appear to work in this instance: 我还在Doctor模型内部创建了一个关系链接,该链接可用于将Doctor与脚本联系起来,但在这种情况下似乎不起作用:

public function scripts() {
    $this->load(['patients.scripts' => function($query) use (&$relation) {
        $relation = $query;
    }]);

    return $relation;
}

What I am attempting to do is allow admin staff and our users to download CSV files that contain all of their scripts. 我正在尝试做的是允许管理员和我们的用户下载包含所有脚本的CSV文件。 While this works fine for admin staff as I can reference the models directly, I am not able to make it work for users because they are tied to the doctors, and I cannot seem to tie this into scripts as normal. 虽然这对于管理员人员来说很好用,因为我可以直接引用模型,但由于它们与医生联系在一起,因此我无法使其对用户有用,而且我似乎无法像平常一样将其与脚本联系起来。 Here is a perfectly working version for admin staff: 这是适合管理员的完美工作版本:

$doctors = Doctor::orderBy('last_name', 'asc')->get();
$patients = Patient::orderBy('last_name', 'asc')->get();
$scripts = Script::orderBy('prescribe_date', 'desc')->get();

$csvExporter->beforeEach(function ($script) use ($doctors, $patients) {
    $patient = $patients->where('id', $script->patient_id)->first();
    $doctor = $patient->doctors->first();
    $script->patient = $patient->full_name;
    $script->doctor = $doctor->full_name;
});

Here is how the user-specific version appears: 这是用户特定版本的显示方式:

$doctors = User::
    find(Auth::user()->id)
    ->doctors()
    ->orderBy('last_name', 'asc')
    ->get();
$patients = Patient::orderBy('last_name', 'asc')->get();
$scripts = $doctors->scripts()->get();

Trying to chain in my Doctor model scripts() function results in an error: Method Illuminate\\Database\\Eloquent\\Collection::scripts does not exist. 尝试链接我的Doctor模型的scripts()函数会导致错误: Method Illuminate\\Database\\Eloquent\\Collection::scripts does not exist.

$doctors = User::
    find(Auth::user()->id)
    ->doctors()
    ->orderBy('last_name', 'asc')
    ->get();
$patients = array();
$scripts = array();
foreach ($doctors as $doctor_fe) {

    foreach ($doctor_fe->patients as $patient_fe) {
        $patients[] = $patient_fe;

        foreach ($patient_fe->scripts as $script_fe) {
            $scripts[] = $script_fe;
        }
    }
}

I also tried to pull the information using arrays, but unfortunately, it must be a Collection passed in via this error: Argument 1 passed to Laracsv\\Export::addCsvRows() must be an instance of Illuminate\\Database\\Eloquent\\Collection, array given 我也尝试过使用数组提取信息,但是不幸的是,它必须是通过此错误传递的Collection: Argument 1 passed to Laracsv\\Export::addCsvRows() must be an instance of Illuminate\\Database\\Eloquent\\Collection, array given

I settled by placing all of the patients belonging to the user's doctors through a foreach loop, then using another one to grab the patient's id. 我通过将所有属于用户医生的患者放置在一个foreach循环中来解决,然后使用另一个患者来获取患者的ID。 I then took the patient's id array and used the whereIn function to compare the Script's patient_id field to get the correct strips. 然后,我获取了患者的id数组,并使用whereIn函数比较脚本的Patient_id字段以获取正确的条带。

$doctors = User::
    find(Auth::user()->id)
    ->doctors()
    ->orderBy('last_name', 'asc')
    ->get();

$patients_array = array();

foreach ($doctors as $doctor_fe) {
    $patients_fe = $doctor_fe->patients;
        foreach ($patients_fe as $patient_fe) {
            $patients_array[] = $patient_fe->id;
         }
     }

$patients = Patient::orderBy('last_name', 'asc')->get();
$scripts = Script::whereIn('patient_id', $patients_array)->get();

$csvExporter->beforeEach(function ($script) use ($doctors, $patients) {
    $patient = $patients->where('id', $script->patient_id)->first();
    $patient_initials = substr($patient->first_name, 0, 1) . substr($patient->last_name, 0, 1);
    $doctor = $patient->doctors->first();
    $script->patient = $patient_initials;
    $script->doctor = $doctor->full_name;
});

If I interpret you question correctly, you want to get all scripts of all patients of a doctor. 如果我正确地解释了您的问题,那么您想获取医生所有患者的所有脚本。 Laravel provides the hasManyThrough() Method for this: Laravel为此提供了hasManyThrough()方法:

class Doctor extends Model
{
    /**
     * Get all of the scripts for the patient.
     */
    public function scripts()
    {
        return $this->hasManyThrough(App\Script::class, App\Patient::class);
    }
}

The first param is the model you want to get (the scripts); 第一个参数是您要获取的模型(脚本); the 2nd param is the intermediate model (the patient). 第二个参数是中间模型(患者)。

To use it: 要使用它:

$doctor = Doctor::first();
$scripts = $doctor->scripts;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM