В моем массиве отношений в методе Laravel Eloquent не было получено данных - PullRequest
1 голос
/ 12 октября 2019

Я использовал eloquent в своем контроллере для сбора данных из моей базы данных, но случилось нечто странное. Если я использую этот код ниже,

$female_old_visitors = Treatment::with('diseases', 'patient', 'insurance', 'referer')
            ->leftJoin('patients', 'treatments.patient_id', 'patients.id')
            ->where('treatments.visit_status', 'old')
            ->where('patients.gender', 'female')
            ->whereBetween('treatments.date', $date_range)
            ->get();

, я могу получить все данные, которые я хочу, включая болезни и реферер

    Collection {#3053 ▼
  #items: array:25 [▼
    0 => Treatment {#2799 ▼
      ...
      #relations: array:4 [▼
        "diseases" => Collection {#3346 ▼
          #dates: array:1 [▶]
          #cascadeDeletes: array:1 [▶]
          #guarded: []
          #connection: "mysql"
          #table: "diseases"
          #primaryKey: "id"
          #keyType: "int"
          +incrementing: true
          #with: []
          #withCount: []
          #perPage: 15
          +exists: true
          +wasRecentlyCreated: false
          #attributes: array:32 [▶]
          #original: array:32 [▶]
          #changes: []
          #casts: []
          #dateFormat: null
          #appends: []
          #dispatchesEvents: []
          #observables: []
          #relations: []
          #touches: []
          +timestamps: true
          #hidden: []
          #visible: []
          #fillable: []
          #forceDeleting: false
        }
        "patient" => Patient {#3328 ▶}
        "insurance" => Insurance {#3346 ▶}
        "referer" => TreatmentReferer {#3138 ▶}
      ]
      #touches: []
      +timestamps: true
      #hidden: []
      #visible: []
      #fillable: []
      #forceDeleting: false
    }

, но когда я использую другой код, подобный этому

$common_insurance_old_visitors = Treatment::with('diseases', 'patient', 'insurance', 'referer')
        ->leftJoin('insurances', 'treatments.insurance_id', 'insurances.id')
        ->where('treatments.visit_status', 'old')
        ->where('insurances.id', 1)
        ->whereBetween('treatments.date', $date_range)
        ->get();

все данные были выбраны или собраны, кроме болезни и реферера

    Collection {#3053 ▼
  #items: array:25 [▼
    0 => Treatment {#2799 ▼
      ...
      #relations: array:4 [▼
        "diseases" => Collection {#3246 ▼
          #items: []
        }
        "patient" => Patient {#3328 ▶}
        "insurance" => Insurance {#3346 ▶}
        "referer" => null
      ]
      #touches: []
      +timestamps: true
      #hidden: []
      #visible: []
      #fillable: []
      #forceDeleting: false
    }

Я проверял в своей базе данных, что данные все еще там и столбец не пустой, он должен бытьсобраны так же, как код, который я использую первым. Это потому, что я использую левое соединение неправильно? я все еще новичок в Laravel, спасибо всем, кто дал мне решение этой проблемы

это моя модель для лечения

    <?php

namespace App;

    use Carbon\Carbon;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\SoftDeletes;
    use Iatstuti\Database\Support\CascadeSoftDeletes;

class Treatment extends Model
{
    use SoftDeletes, CascadeSoftDeletes;

    protected $dates = ['deleted_at'];
    protected $cascadeDeletes = ['medicines', 'actions', 'referer', 'diseases', 'queues'];
    protected $guarded = [];

    public function queues(){
        return $this->hasMany(TreatmentQueue::class);
    }

    public function treatmentType(){
        return $this->belongsTo(TreatmentType::class);
    }

    public function medicines(){
        return $this->hasMany(TreatmentMedicine::class)->with('medicine', 'recu');
    }

    public function actions(){
        return $this->hasMany(TreatmentAction::class)->with('action', 'doctor', 'nurse', 'recu', 'teeth', 'therapy', 'treatmentDisease');
    }

    public function insurance(){
        return $this->belongsTo(Insurance::class);
    }

    public function referer(){
        return $this->hasOne(TreatmentReferer::class)->with('puskesmas', 'disease');
    }

    public function diseases(){
        return $this->hasMany(TreatmentDisease::class)->with('disease', 'doctor', 'teeth');
    }

    public function patient(){
        return $this->belongsTo(Patient::class);
    }


}

1 Ответ

1 голос
/ 12 октября 2019

with() для нетерпеливой загрузки . Это в основном означает, что вдоль основной модели Laravel будет предварительно загружать указанные вами отношения. Это особенно полезно, если у вас есть коллекция моделей, и вы хотите загрузить отношение для всех них. Потому что при активной загрузке вы запускаете только один дополнительный запрос к БД вместо одного для каждой модели в коллекции.

В вашем примере.

вы используете левое соединение, почему? он уже содержится в with() вы используете with('patient') это означает, что вы присоединяетесь treatments к левое соединение с patient

$female_old_visitors = Treatment::with('diseases', 'insurance', 'referer')
                        ->with(['patient' => function ($q) {
                                $q->where('gender', 'female');
                            }])
                            ->where('visit_status', 'old')
                            ->whereBetween('treatments.date', $date_range)
                            ->get();

eager-load

...