Partage
  • Partager sur Facebook
  • Partager sur Twitter

Relation Laravel non concluante

Sujet résolu
    24 octobre 2021 à 16:44:07

    Bonjour,

    Je viens vers vous car je ne trouve pas de solution à mon problème (j'ai tenté en vain de chercher un peu partout mais cela m'est visiblement passé sous le nez).

    J'ai deux modèles sur Laravel: bank_accounts et bank_account_types

    bank_accounts belongsTo bank_account_types

    bank_account_type hasMany bank_accounts


    Simple sur le papier mais relativement casse bonbons pour récupérer le type de compte.

    Via mon Controller, je récupère mes données comme suit:

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use App\Models\BankAccount, App\Models\BankAccountType;
    
    class BankController extends Controller
    {
        public function __construct() {
    
        }
    
        public function index(Request $request) {
            return response()->json(BankAccount::with([
                'type', // le fameux
                'expenses', // relations hasMany expenses qui fonctionne
                'incomings',// relations hasMany incomings qui fonctionne
                'regularFees'// relations hasMany regularFees qui fonctionne
            ])->get(), 200, [], JSON_PRETTY_PRINT);
            
        }
    }

    Le Model BankAccount.php:

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use App\Models\BankAccountType,
        App\Models\BankExpense,
        App\Models\BankIncoming,
        App\Models\BankRegularFee;
    
    class BankAccount extends Model
    {
        use HasFactory;
    
        public function type() {
            return $this->belongsTo(BankAccountType::class);
        }
    
        public function expenses() {
            return $this->hasMany(BankExpense::class);
        }
    
        public function incomings() {
            return $this->hasMany(BankIncoming::class);
        }
    
        public function regularFees() {
            return $this->hasMany(BankRegularFee::class);
        }
    }

    Et le modèle BankAccountType:

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use App\Models\BankAccount;
    
    class BankAccountType extends Model
    {
        use HasFactory;
    
        public function account() {
            return $this->hasMany(BankAccount::class);
        }
    }
    

    Le problème étant que lorsque je récupère mes données, le type apparaît comme NULL alors que la relation existe en BDD et que des données existent également.

    Si quelqu'un peut éclairer ma lanterne... je l'en remercie d'avance!

    0

         id 1

         name "recusandae"

         bank_account_type_id 1

        created_at "2021-10-24T14:23:57.000000Z"

        updated_at "2021-10-24T14:23:57.000000Z"

        type null

            expenses […]

            incomings […]

            regular_fees […]

       
       
       
       
       
       
       
       
       
       

    -
    Edité par Harkhenon 24 octobre 2021 à 16:47:26

    • Partager sur Facebook
    • Partager sur Twitter

    Harkhenon, pour vous servir! ;D

      25 octobre 2021 à 12:14:38

      Hello, 

      Laravel à des conventions bien spécifiques pour le nommage de ses clefs primaires/étrangères qu'il faut respecter pour que tout fonctionne correctement... Je ne connais pas la structure de ta BD donc je saurais pas trop te dire où est le soucis mais le problème vient sûrement de là (étant donné que les définitions de tes relations semble correcte)...

      Mais tu peux passer outre ses conventions en spécifiant la clef étrangère dans ta relation. ça doit ressembler à un truc comme ça : 

      // dans ton modèle BankAccount
      public function type() {
         return $this->belongsTo(BankAccountType::class,'ta_clef_etrangere');
      }

      Et normalement ça doit bien fonctionner... :) 

      Si jamais tu veux checker les conventions, je te redirige vers la doc Laravel (que tu as peut être déjà vu) : https://laravel.com/docs/8.x/eloquent-relationships#one-to-many-inverse

      Edit : A priori, c'est le nom de ta relation qui pose problème ici, Eloquent va essayer de chercher une clef étrangère dans ta table en se basant sur le nom de ta relation et en y ajoutant _id à la fin. Comme ici ta relation est nommé type, Eloquent va chercher une clef étrangère type_id, ce qui ne doit pas correspondre à ta clef étrangère dans bank_accounts.

      Cf la doc de Laravel du lien que je t'ai mis précédemment : Eloquent determines the default foreign key name by examining the name of the relationship method and suffixing the method name with a _ followed by the name of the parent model's primary key column. So, in this example, Eloquent will assume the Post model's foreign key on the comments table is post_id..

      -
      Edité par hippomssc 25 octobre 2021 à 12:31:10

      • Partager sur Facebook
      • Partager sur Twitter
        25 octobre 2021 à 21:33:37

        Bonjour skywalskurt,


        Merci tout d'abord de ta réponse.
        En effet il m'est possible de spécifier une clé étrangère au niveau de ma relation belongsTo et je l'ai finalement fait, ce qui a fonctionné.

        J'ai ouvert la doc pour connaître les conventions de nommage de Laravel et, même si elles sont relativement simples, m'ont donné du fil à retordre dans mes seeders.

        Il va falloir que je remette tout ça à jour comme il faut et que je me re-penche sur la doc.

        En tous cas, cela fonctionne, c'est le principal.


        N.B: D'après ce que j'ai pu comprendre, Laravel ne se base pas sur le nom de la méthode pour définir la clé étrangère, mais sur le nom de la classe du modèle à relier (en l'occurence: BankAccountType qui en snake case donne bank_account_type et donc bank_account_type_id pour la clé étrangère) et j'ai pu le vérifier.


        Merci pour tes éclairages! ;)

        • Partager sur Facebook
        • Partager sur Twitter

        Harkhenon, pour vous servir! ;D

        Relation Laravel non concluante

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown