Besoin d'aide ?

Soucis de relation table/model

  • Avatar de Romu
    Membre depuis :
    23/02/2017
    Messages :
    25

    Bonjour,

    Je débute sous laravel, merci à bestmomo pour les tuto d'ailleurs..

    Mais là j'arrive à un petit soucis de compréhension par rapport aux models et tables/tables pivots.
    Pour le moment j'ai réussi le début de la base de données mais là je sèche un peu.. et du coup je me dis que je m'y prends peut être pas la bonne façon, donc je viens quérir vos lumière pour mieux comprendre.

    En fait, je voulais partir sur une table 'factures' qui contient un id, un nom et les timestamps, une table payement qui contiendrait un id, un facture_id, un montant payé et les TS aussi, et une troisieme table qui contiendrait des types de paiments avec un id et un nom..

    J'etais partis sur

    • le model Facture qui aurait une méthode payements avec hasMany (parce qu'une facture peut avoir plusieurs payements)
    • le model payement qui aurait une méthode facture avec belongsto (parce qu'un payement ne peux avoir qu'une seule facture)
    • le model payement qui aurait une methode payement_type hasone (parce qu'un payement ne peux avoir qu'un type)
    • le model payement_type qui aurait une methode payments( parce qu'un type peux avoir plusieurs payement)

    Mais après plusieurs essais sur tinker je n'arrive pas à avoir les resultat attendus, donc j'en suis arrivé au fait que je n'avais pas tout compris, fait assez facile à admettre .. peut être une histoire de pivots mais bon à force de tout retourner dans ma tête j'en viens peut être à tout mélanger ..

    Merci d'avance pour l'aide et l'eclairage apporté sur mon problème..

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

    Bonjour,

    Il vaut mieux commencer par bien clarifier le schéma de la base avec les relations.

    Donc tu as 3 tables avec :

    • une relation un à plusieurs entre les factures et les paiements (clé étrangère des factures dans cette table)
    • une relation un à plusieurs entre les types de paiement et les paiements (donc il faut aussi une clé étrangère dans cette table)

    Les relations à mettre en place dans les modèles découlent de ça. On a deux fois du hasMany / belongsTo.

    En fait la table des paiements se retrouve de fait devenir un pivot entre les deux autres tables et on peut aussi mettre en place les relations correspondantes au besoin (belongsToMany). Par exemple pour connaître le type de paiement d'une facture.

    Tout dépend en fait des requêtes à faire...

  • Avatar de Romu
    Membre depuis :
    23/02/2017
    Messages :
    25

    Merci pour a réponse, en fait entre temps j'ai un peu potassé le truc et j'ai compris mon soucis.. enfin l'un d'eux... (en fait je pense que mon projet aurait un jour besoin d'un oeil exterieur étant tout seul dessus j'ai pas la meilleur vision possible mais c'est une autre histoire)

    Ma table paiement etait bien un table pivot mais je cherchais à la gérée comme une table normale avec un model , là était mon erreur du coup j'ai un peu clarifié ça, j'ai plus que les deux models, facture et les types de paiement et j'ai associé avec deux belongToMany.. sachant que j'ai pas enorment de requetes à faire dessus ca sera largement suffisant..

    Par contre, depuis j'ai soulevé un autre problème sur d'autre relations pour lesquelles j'ai besoin d'un model propre j'ai cru lire sur diverse ressource que l'on pouvait creer des models propre au pivot en rajoutant un methode newPivot(), chose que j'ai essayé mais j'ai encore était confronté à des difficultées .. c'est pas facile d'adpater l'existant ...

    En fait mon problème actuel est le même qu'auparavant .. j'ai deux tables :

    • clients qui n'est autre que la table users de laravel renomé
    • idcard, qui est une table qui liste des abonnements (d'unitées/copiees)

    Du coup un clients peut avoir plusieurs idcards, logique, donc du belongsToMany, jusque là je pense avoir saisi, de facto j'ai une table client_idcard (si j'ai bien suivi la convention de nommage)
    sauf que j'ai besoin d'un model parce que c'est cette table là qui est un peu le coeur du projet et sur laquelle j'ai le plus besoin de travailler, donc en cherchant un peu je suis tombé sur des choses comme ca (les noms ne correspondent pas) :

    public function newPivot(Model $parent, array $attributes, $table, $exists)
    {
    if ($parent instanceof User) {
    return new CategoryUserPivot($parent, $attributes, $table, $exists);
    }

    return parent::newPivot($parent, $attributes, $table, $exists);
    }

    Mais je tombais sur des erreurs comme quoi le nombre de parametre ne correspondaient pas à la définition de la fonction, si besoin je peux recreer pour te donner l'erreur exacte... par contre, fait particulier, en http j'avais bien l'erreur, mais sous tinker quand quand j'executais la commande, j'avais en retour une erreur (normal..) mais si je ré-excutais la même commande, la deuxieme fois elle passait sans problème ..

    Donc j'en suis revenu à une methode, qui je pense, est un peu bourrin, mais ça la mérite de marcher pour l'instant, j'ai creer un model ClientIdcard, dans lequel j'ai rejouté les méthodes belongsTo, inversement dans les models clients et idcard et ça à le mérite de marcher.

    Cependant, je suis ouvert à toute nouvelle approche, surtout si elle est meilleur que la mienne et qu'elle me fait progresser sur le compréhension. Et je peux même plus détaillé le projet.

    Petit précision, je suis dev junior, le projet a déjà était développé from scratch par moi même, avec du php/jquery et des procédures stockées, c'est juste que dans la cadre d'une amélioration constante j'ai décidé de me lancé dans un framework et de reprendre se projet d'une meilleure facon .. sans doute pour ca que j'ai un peu mal à adatper tout :x
    Et désolé pour la pavé ..

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

    Salut,

    En général créer un modèle pour le pivot avec des relations belongsTo est le plus clair et pratique.

  • Avatar de Romu
    Membre depuis :
    23/02/2017
    Messages :
    25

    Au final je trouve aussi, même si c'est pas la meilleur méthode tant pis..
    Merci pour les réponses en tout cas !

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

    La meilleure méthode c'est toujours celle qu'on maîtrise le mieux et qui nous permet d'être efficace ;)

Vous ne pouvez pas répondre à ce sujet.