Salut,

J'ai une app à créer où des gens vont vendre des légumes à d'autres gens.

J'ai déjà créé le schéma de ma BDD et j'en suis au stade où je dois traduire ce shéma en langue Eloquent !

Et mon soucis arrive quand une table pivot (many-to-many) doit aussi avoir une relation many-to-many avec une autre table.

Je m'explique :

J'ai un model Variete, et un model Type
Type recensera les "tomates", "carottes", "fraise", ...
Variete recensera quant à lui les différentes variétés de ces type, à savoir "gariguettes", "des bois", "coeur de boeuf", ...

Ainsi, j'aurais une relation many-to-many entre ces 2 models. Conséquence, une table pivot, qui sera une combinaison entre un type et une variété donnant donc un produits, "Fraise gariguette", "Fraise des bois", "Tomate coeur de boeuf", ...

Mon problème arrive maintenant.

Il se trouve que mon model User est sensé pouvoir vendre ces produits, présents dans la table pivot.
Sauf que cette table pivot n'étant pas un modèle défini à proprement parlé, je ne vois pas comment créer une ralation many-to-many entre mon model User et cette table pivot.

Est-ce possible d'une façon ou d'une autre ?

Ou suis-je condamané à ne pas pouvoir utiliser Eloquent pour mon modèle (dommage !) ?
J'ai le schéma de ma BDD si ça peut aider ... mais comment le partager autrement qu'en MP ?

Merci

8 réponses


Salut,

Tu as dont du many-to-many entre le type et la variété si je comprends bien. Je n'arrive pas à comprendre ce qui te pose souci exactement ?

Salut betaWeb !

Mon soucis c'est l'etape suivante.
Avec cette relation j'ai par consequent créé une table intermédiaire (pivot). Et je voudrais maintenant créer une relation many-to-many entre cette table pivot et mon modèle User.

Mais un produit appartient à un user ? Ou le user achète le produit ? Car ne n'est pas du tout la même chose !
Ton Type devrait être en many-to-many avec le Produit qui devrait etre aussi en many-to-many avec l'User.
Mais ce n'est pas encore juste selon moi : s'il y a système d'achat en ligne, réfléchis à un système de panier plutôt :
Ton user ajoute un ou plusieurs Produits dans son panier : un Panier peut contenir un ou plusieurs Produits, un Produit peut avoir un ou plusieurs Types (c'est encore à voir ça), un Type peut avoir une ou plusieurs Variétés. Enfin, un User a un et un seul Panier (donc un Panier appartient à un et un seul User).

Pour ce qui est des personnes qui vendent : un Produit appartient à un et un seul User et un User peut avoir un ou plusieurs Produits.
Il n'y a pas de many-to-many ici : plusieurs Users ne peuvent vendre le même Produit, on est d'accord (sinon y'a un souci) ?

J'espère que ça pourra t'aider ;)

betaWeb, je retiens ton idée de panier qui en effet risque de me simplifier quelques aspects.
Ton analyse relationnelle est très bonne mais dans mon cas un détail pose problème.

En effet, pour toi et pour Blobby, un Produit peut avoir avoir un ou plusieurs Type, et un Type peut avoir une ou plusieurs Variétés.

Sauf que, dans ce modèle un Produits est relié à un Type et pas à une Variété. Or pour moi, je vais mettre dans un Panier, un Produit qui est la combinaison d'un Type et d'une Variété. Et côté vendeur, idem, il vendra un Produit qui est une combinaison d'un Type et d'une Variété.
En effet, dire que je met une "Tomate" dans mon panier n'est pas satisfaisant. Je dois pouvoir préciser que j'ai mis une "Tomate"(Type) + "coeur de boeuf"(Variété) dans mon panier (ou en vente).

Du coup, ma seule solution est d'avoir une relation belongsToMany dans les deux sens entre mes modèles Type et Variété. Jusque là on est d'accord. Du coup le pivot qui en découle type _ variete (ce qu'on a désigné par produit tous les 3) n'est pas un modèle mais un pivot.
Alors, comment puis-je relier ce pivot avec une relation belongsToMany à un modèle Panier par exemple ?

Est-ce plus clair ?

Si si j'avais bien compris : quand tu récupère la liste de tes produits, il suffira de récupérer la liste des types associés à ce produit, et de récupérer la liste des variété associés aux types récupérés. Après tu pourras faire ton mic-mac et voilà.

Mais, ôte-moi d'un doute : quand la personne va ajouter un produit à son panier, elle va choisir le type du produit et la variété si je comprends bien (un peu comme quand tu achètes un tshirt, tu choisis sa couleur et sa taille), et chaque produit aura son type, et chaque type aura ses variétés, c'est ça ? Ou je suis complètement à côté de la plaque ?

Oui c'est tout à fait ça betaWeb.
Et je viens de réaliser qu'avec un système de panier on peut voir la chose différemment de ce que j'avais prévu initialiement.
Et du coup zapper mon pivot entre Type et Variété.
Du coup je pourrai avoir :
Un User hasOne Panier
Un Panier belongsTo User
Un Panier BelongsToMany Produit, et Produit BelongsToMany Panier ( ==> pivot panier _ produit )
Produit hasOne Type, et Type belongsTo Produit
Produit hasOne Variete, et Variete belongsTo Produit
Type HasMany Variete, et Variete belongsTo Type

Ca vous semble correct Eloquent(ement) parlant ?

salut, je pense avant de passer à l'étape d'implementation la base de donnée avec l'ORM Eloquent par exemple, il faut prendre son temps pour bien compredre et réflichir à la problématique pour concevoir ton shémas de base de donnée.

l'étape de conception est une étape importante et il ne faut pas se précipité dans le codage.

voici quelques éléments :

je pense que un type de légume à plusieurs variantes et une variante à partient à un seul type de légume.

un produit (légumes) partient à une variante et une variante à plusieures produits (légumes).

un "user" peut être un vendeur ou acheteur (avoir un role ou type user)

un vendeur vend un ou plusieurs produits (légumes)

un acheteur achet un ou plusieurs produits (légumes)

un produit appartien à un vendeur,

un produit peut être acheter par plusieurs acheteurs,

une commende pour se faire par un seul acheteur,

une commende contient un ou plusieurs produits (légumes),

un produit peut être dans une ou plusieurs commendes (table pivot avec quantité et prix)

voila un exemple qui peut j'espere t'aidé.

Disons qu'il faut que tu penses en terme de User : le panier n'est pas censé être persisté, il est juste là pour accueillir les produits que voudrait acheter le User (donc en fait pas de table Panier, juste une clé en session). Quand je parlais de Panier, je voulais parler des Produits qu'a déjà acheté le User. Je ne sais pas si tu comprends où je veux en venir ? :)
Sinon pour le reste tu es sur la bonne piste ;)