Projets Laravel France

Projet gestion clients commandes produits

  • Avatar de sergentMicklin
    Membre depuis :
    01/01/2020
    Messages :
    6

    Bonjour à tous,

    Pour un projet, je dois gérer des clients, chaque client ayant une (ou plusieurs) commande.
    Une commande peut comporter un (ou plusieurs) produit.

    Pour ce, j'ai pensé mettre un/des panier(s) dans chaque commande, et dans chacun de ces paniers y mettre mes produits.
    On aura donc les tables clients, commandes, panier, produits, avec les modèles et controller associés, pas de souci.

    Maintenant, je dois afficher toutes les commandes d'un client (avec la liste produits) en une seule fois :

    Client A
    commande 1 (200 euros)
    produit 1 produit 2

    commande 2 (56 euros)
    produit 5

    commande 3 (0 euros)
    (vide)

    en utilisant des cards bootstrap, par ex.

    Je ne vois pas trop comment faire pour ramener toutes ces infos en une brassée dans le controller ? Et comment passer ces infos à la view, avec des with() ?
    Faudra aussi voir à gérer l'effacement...

    Merci à vous ! :)

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

    Salut,

    Il faut déjà bien construire tes modèles si tu utilises Eloquent avec les relations qui vont bien.

  • Avatar de sergentMicklin
    Membre depuis :
    01/01/2020
    Messages :
    6

    Merci de ta réponse.

    Alors, on aurait les relations suivantes :

    un contact a plusieurs commandes (hasMany)
    une commande appartient à un contact (belongsTo)

    une commande a plusieurs produits (hasMany)
    un produit appartient à plusieurs commandes (hasMany)

    Du coup, j'ai créé les relations suivantes dans les modèles :

    Contact.php

    // 1 client has many commandes
    public function commandes()
    {
    return $this->hasMany(Commande::class);
    }

    Commande.php

    // 1 commande belong to 1 user
    public function Contact()
    {
    return $this->belongsTo(Contact::class);
    }

    // 1 commande has many produits
    public function produits()
    {
    return $this->hasMany(Produit::class);
    }

    Produit.php

    // 1 produit has many commandes

    public function commandes()
    {
    return $this->hasMany(Commandes::class);
    }

    Maintenant, je souhaiterais pouvoir lister tous les produits des toutes les commandes du client A, par exemple :

    commande 1
    pois raviolis
    commande 2
    briques ciment
    commande 3
    (vide)

    dans ma vue ?

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

    Salut,

    Si une commande a plusieurs produits et un produit a plusieurs commandes alors ce n'est pas hasMany. Tu as besoin d'une table pivot et d'une relation belongsToMany.

  • Avatar de sergentMicklin
    Membre depuis :
    01/01/2020
    Messages :
    6

    Ok, donc on aurait :

    un contact a plusieurs commandes (hasMany)
    une commande appartient à un contact (belongsTo)

    une commande a plusieurs produits (hasMany)
    un produit appartient à plusieurs commandes (belongsToMany)

    et donc produit.php devient :

    Produit.php

    // 1 produit belongs to many commandes

    public function commandes()
    {
    return $this->belongsToMany(Commandes::class);
    }

    Je me renseigne sur les tables pivot (un peu comme une jointure, en fait ?)

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

    En fait tu as aussi :

    une commande appartient à plusieurs produits (belongsToMany)

    C'est une relation symétrique avec une table pivot commande_produit. Regarde la doc ici. J'avais écrit un article sur le sujet qui date un peu mais reste correct sur le principe.

  • Avatar de sergentMicklin
    Membre depuis :
    01/01/2020
    Messages :
    6

    Merci pour la doc sur les relations, nickel !

    Bon, j'espère que ce n'est pas trop long, en tout cas, grand merci pour ton aide !

    Alors, j'ai fait :

    php artisan make:migration create_commande_produit_table

    -> migration :

    public function up()
    {
    Schema::create('commande_produit', function (Blueprint $table) {
    //id commande_produit, rendre table browsable
    $table->increments('id_pivot');

    // id commandes
    $table->bigInteger('commande_id');

    // id produit
    $table->bigInteger('produit_id');
    });

    }

    nb: on pourrait aussi :
    $table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade');
    ?

    Resultat :

    -> table commande_produit

    avec 3 colonnes : id_pivot, commande_id, produit_id

    Pas de souci jusque-là. Maintenant, je fais fonctionner (je triche un peu, en mettant à la main 0, 1, 5, 6 comme produits en bdd) :

    -> mettre un produit (6) dans plusieurs commandes:

    $ma_commande = Commande::find($id_client);
    $mon_produit = Produit::find('6'); // ok

    $mon_produit->commandes()->attach([789, 456]); // on attache le produit 6 aux commandes 789 et 456

    -> mettre des produits (0, 1, 5, 6, 9, 11) dans une commande (7):

    $ma_commande = Commande::find(7);
    $ma_commande->produits()->attach([0, 1, 5, 6, 9, 11]);

    ->enlever des produits (6,9,11) d'une commande (7):

    $ma_commande = Commande::find(7);
    $ma_commande->produits()->detach([6,9,11]);

    Reste à voir le sync(), mais dans l'ensemble cela semble bien se passer, sauf piège :)

    Maintenant, comment récupérer mes infos (les prods et les commandes du client A), et passer tout cela à la view ? Tableau asso ? String ?

  • Avatar de sergentMicklin
    Membre depuis :
    01/01/2020
    Messages :
    6

    J'ai bien sûr corrigé le belongsToMany

  • Avatar de KYoann
    Membre depuis :
    11/02/2019
    Messages :
    60

    Salut,

    Dans ton controller tu peut faire

    $commandes = Commande::where('user_id','=',12341)->get()

    return view('listeCommandes',compact('commandes'));

    Dans la Vue


    @foreach($commandes as $commande)

    {{$commande->numero}}
    etc

    @foreach($commande->produits as $produit)

    {{$produit->id}}
    {{$produit->nom}}
    etc

    @endforeach

    @endforeach
  • Avatar de sergentMicklin
    Membre depuis :
    01/01/2020
    Messages :
    6

    Merci à vous deux, cela fonctionne, j'affiche bien les produits de tel client dans sa (ou ses) commandes !

    Bon, reste à voir les ajouts/supressions, maintenant...

Vous ne pouvez pas répondre à ce sujet.