Bonsoir,

J'aimerai arriver à faire parler 3 tables correctements avec Laravel 5.5, mais je n'y arrive pas...

J'ai 3 tables, assez simples, user, wallet et wallet_type

La constitution est comme ceci :

  • user

    • id
    • email_address
    • password
  • wallet

    • id
    • user_id
    • wallet_type
  • wallet_type

    • id
    • name
    • code

Ce que je fais

Dans mon template, j'aimerai récupérer le wallet et le wallet_type selon un user spécifique

Model User.php

public function wallets()
{
    return $this->hasMany('App\Wallet');
}

Model Wallet.php

public function user()
{
    return $this->belongsTo('App\User');
}

public function walletType()
{
    return $this->hasOne('App\WalletType');
}

Model WalletType.php

public function wallet()
{
    return $this->belongsTo('App\Wallet');
}

Ce que je veux

J'aimerai donc récupérer dans mon blade un truc du style

@foreach(wallets as wallet)

    {{ $wallet->walletType->name }} ou {{ $wallet->walletType()->name }}

@endforeach

Les wallets se récupèrent sans problèmes, mais c'est le walletType->name que je n'arrive pas à afficher...

Je fais sûrement quelque chose de mal, mais je n'arrive pas à mettre la main dessus.

Merci de votre aide !

4 réponses


Amilti
Réponse acceptée

hello,
Je pense qu'il y a deux soucis :

  • tu as définis un hasOne sur ton Model wallet du cou c'est ta table wallet_type qui doit être propriétaire de la clef étrangère .
    En partant du principe que ta clef étrangère c'est wallet_type tu devrait plutôt avoir :

Model Wallet.php

public function walletType()
{
    return $this->belongsTo('App\WalletType');
}

Model WalletType.php

public function walletType()
{
    return $this->hasOne('App\Wallet');
}

En gros c'est le même pricnipe qu'un hasMany/belongsTo

  • le 2ème souci est plus une histoire de convention sur Eloquent :
    Par convention quand tu as un belongsTo , eloquent va chercher un nom de champ pour ta clef étrangère qui correspond au nom de la table au singulier avec comme suffix _id donc ici -> wallet_type_id .
    Si je pars du principe que ta clef c'est wallet_type ça ne fonctionnera pas , tu dois donc dire à eloquent quel est le nom de la clef étrangère sur la table en question :
public function walletType()
{
    return $this->belongsTo('App\WalletType', 'wallet_type');
}

bonne chance

Hello,

dans ton model WattetType essaie de retourner dans ta fonction wallet :

return $this->belongsTo(Wallet::class)->with('user');

Et fais un dd($wallets) dans ton controller pour vérifier si tu récupères bien l'info.

Gaspard
Auteur

Hello, merci de ta réponse !

J'ai fait ce que tu m'as dit, et malheureusement pas de changement à l'horizon..

Dans mon HomeController.php

$user = User::find(Auth::id());
dd($user->wallets);

Le résultat

La fonction WalletType

La fonction Wallet

La fonction User

Merci de ton aide ! :)

Gaspard
Auteur

Super, merci @Amilti !

Je pense que c'était la convention d'Eloquent que je maitrisais mal, parce que j'avais cette approche au début, mais ça ne fonctionnait pas, alors j'ai essayé d'autre chose.

Je ferais plus attention la prochaine fois pour la manipulation !

Merci encore !