Laravel 5

Problème de requête pour blade

  • Avatar de Pandora
    Membre depuis :
    20/03/2018
    Messages :
    4

    Bonjour à tous

    Je m'essaye à mon premier projet Laravel et je tatonne encore pas mal, du coup je n'arrive pas à construire une requête pour une vue blade.

    Voici un extrait simplifié de ma base :

    patient [ id ,...]
    patient_hcv_genotype [ id, id_patient, id_genotype]
    list_genotype[id, label]

    Quelques models

    class Patient extends Model
    {
    protected $table = 'patient';

    public function hcv_genotypes(){
    return $this->hasMany(PatientHcvGenotype::class, 'id_patient');
    }
    class PatientHcvGenotype extends Model
    {
    protected $table = 'patient_hcv_genotype';

    public function genotype(){
    return $this->belongsTo(ListHcvGenotype::class,'id_genotype');
    }

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

    }
    class ListHcvGenotype extends Model
    {
    protected $table = 'list_hcv_genotype';

    public function patient_hcv_genotypes(){
    return $this->hasMany(PatientHcvGenotype::class,'id_genotype');
    }
    }

    Un bout de controlleur

    public function index()
    {
    $patients = Patient::all();
    return view('patient.index',compact('patients'));
    }

    J'essaye dans blade d'afficher simplement le dernier génotype sorti de patient_hcv_genotype trié par date et là je suis perdue ...

    J'ai tenté dans le Model Patient de faire un

    public function last_hcv_genotype(){
    return $this->hasOne(PatientHcvGenotype::class, 'id_patient')->orderBy('date', 'desc')->limit(1);
    }

    Dans blade si je l'affiche avec
    $patient->last_hcv_genotype()->first()
    J'affiche un magnifique {"id":2,"id_patient":3,"id_hcv_genotype":4,"id_hcv_genotype_method":2,"date":"2018-02-02"}
    Je suppose que c'ets une collection, mais c'ets un peu une impasse, j'aimerai continuer plus loin et pouvoir afficher ceci :

    $patient->last_hcv_genotype()->genotype->label (dans l'idée)

    Quelqu'un peut me renseigner sur comment faire ?

    Merci d'avance

    Pandora

    @edit copier coller foireux

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2079

    Salut,

    Je pense qu'il y a deux soucis :

  • Avatar de Pandora
    Membre depuis :
    20/03/2018
    Messages :
    4

    Bonjour bestmomo et merci de ta réponse

    La relation patient patient_hcv_genotype n'est pas une relation many to many mais bien une relation many to one.
    Patient va avoir plusieurs patient_hcv_genotype (return $this->hasMany(PatientHcvGenotype::class) , mais patient_hcv_genotype n'appartient qu'a un seul patient (return $this->belongsTo(Patient::class,'id_patient');).
    Je me suis trompée dans les models ? Ou j'ai mal compris un truc ?

    Je regarde pour l'eager loading.

    Pour clarifier : La requête que je cherche à reproduire est la suivante

    SELECT lg.label
    FROM list_genotype lg
    JOIN patient_hcv_genotype phg ON phg.id_genotype = lg.id
    JOIN patient p ON p.id = phg.id_patient
    ORDER BY phg.date DESC
    LIMIT 1
  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    173

    Bonjour, j'entrevois deux possibilités :

    Le racourci que j'utilise souvent, le sql pur (mais bon, je sais pas pq les dev n'aiment pas : ) )

    Donc dans le model list_genotype je créerais une méthode get :

    public static function getLabel()
    {
    return DB::select('SELECT lg.label

    FROM list_genotype lg

    JOIN patient_hcv_genotype phg ON phg.id_genotype = lg.id

    JOIN patient p ON p.id = phg.id_patient

    ORDER BY phg.date DESC

    LIMIT 1'
    );
    }

    Sinon avec un with

    $projets = Projet::with(['patient_hcv_genotypes' => function ($query) {
    $query->select('label', 'id_genotype')->orderBy('date','desc');
    }])->get();
  • Avatar de Pandora
    Membre depuis :
    20/03/2018
    Messages :
    4

    Merci pour la réponse !

    J'avoue que j'ai abandonné et que je suis repassée sur un terrain connu pour moi, étant que je rapatrie quasiment toute la base sur cette page index, je suis allé taper un peu plus dans le sql.

    Mais je retiens quand même les idées pour des requêtes plus simples ;)

    $patients = DB::table('patient as p')
    ->join('list_gender as lg','lg.id','=','p.id_gender')
    [..]
    ->select('p.*','lg.esar as gender',
    [..]
    DB::raw('(SELECT phg.date
    FROM patient_hcv_genotype as phg
    WHERE phg.id_patient = p.id
    ORDER BY phg.date DESC LIMIT(1)) as genodate'),
    [..]
    DB::raw('(SELECT lhg.esar
    FROM patient_hcv_genotype as phg
    JOIN list_hcv_genotype as lhg ON lhg.id = phg.id_hcv_genotype
    WHERE phg.id_patient = p.id
    ORDER BY phg.date DESC LIMIT(1)) as genotype')
    )
    ->get();

    return view('patient.index')
    ->with('patients',$patients);

Vous ne pouvez pas répondre à ce sujet.