Problème de relations LARAVEL

Par pierremarielegoff, il y a 2 ans


Bonjour, j'ai un soucis avec mes relations laravel 8, je ne parviens pas à accéder aux données.
Comme un exemple est plus parlant qu'une longue explication :

J'ai un model Adherent et un model TypeVoie
Un adhérent ne peut avoir qu'un seule Type de voie mais un type de voie peut avoir plusieurs adhérents.

J'ai donc créé mes models comme suit :

Dans TypeVoie j'ai mis :

<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Kyslik\ColumnSortable\Sortable; class TypeVoie extends Model { use HasFactory; use Sortable; protected $table = 'chk_typevoie'; protected $primaryKey = 'TY_ID'; public $timestamps = false; protected $fillable = [ 'TY_ID', ... ]; public function adherents() : HasMany { return $this->hasMany(Adherent::class); } }

Et dans Adherent j'ai mis :

<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Kyslik\ColumnSortable\Sortable; class Adherent extends Model { use HasFactory; use Sortable; public $timestamps = false; protected $table = 'chk_adherent'; protected $primaryKey = 'AD_ID'; protected $fillable = [ 'AD_ID', ... ]; public function typeVoie() { return $this->belongsTo(TypeVoie::class); } }

Et dans mon controller j'ai ce code :

$ads = $this->adherentRepo->getPaginate($this->nbPerPage); foreach ($ads as $a) { dd($a->typeVoie->TY_ID); }

Ce que je veux

Je voudrais qu'il m'affiche l'id du type de voie peut importe son numéro.

Ce que j'obtiens

Cependant j'obtiens l'erreur suivante:

Attempt to read property "TY_ID" on null

Merci d'avance pour votre aide je ne comprends pas ce que je fais mal

1 réponse

pierremarielegoff, il y a 2 ans

Bien j'ai fini par trouver ma réponse.
Je la laisse ici on sait jamais ça pourrait aider quelqu'un.

Comme mes clé primaire ne sont pas "id" mais ont d'autres nom il a fallu que j'adapte mes déclarations de relation comme suit :

Pour le model Adhérent

public function typeVoie1() { return $this->belongsTo(TypeVoie::class, 'AD_FK_TYPEVOIE_ID', 'TY_ID'); }

Pour le model Type de voie

public function adherents() : HasMany { return $this->hasMany(Adherent::class, 'AD_FK_TYPEVOIE_ID', 'TY_ID'); }

Ainsi mes relations fonctionnent dans les deux sens.

Enjoy