Laravel France

Probleme avec polymorphisme Laravel

  • Avatar de XavierDlm
    Membre depuis :
    01/12/2017
    Messages :
    14

    Bonjour alors voila j'ai un probleme avec ma relation de polymorphisme , je possede un table produits qui est la table "mere" avec un nouveau champs a l'interieur qui s'appelle actif et qui sert a savoir si un produit et en veille ou non et donc si l'on doit lafficher ou non .
    je voudrait pouvoir recuperer le champ actif depuis un autre table par exemple la table treuils depuis le controller car j'ai fait toute mes vue et mes controller en utilisant cette facon

    $LesTreuils = Treuil::all();

    et ensuite dans la vue si je voulait le prix qui se trouvait dans la table produits je faisait $unTreuil->produits->prix

    mais helas si dans la vue dans mon foreach je met un condition @if unTreuil->produits->actif == 1 ou quoi que se soit il ne le prend pas en compte je doit faire le tri pendant le traitement dans mon controller avec

    ->where ('actif', 'False')

    mais cela n'est possible que si dans mon controller j'utilise la table produit et j'aimerais eviter d'avoir a changer toute mes vue et mes controller donc je recherche un solution qu'il doit bien existe par exemple avec qqc qui ressemble a ca

    ->where ('produits.actif', 'False')

    Merci de votre aide en esperant avoir été asser clair dans mes explication je vous met ici mes models

    <?php

    namespace App\Models;

    use Illuminate\Database\Eloquent\Model;

    class Treuil extends Model
    {
    public function produits()
    {
    return $this->morphOne('App\Models\Produit', 'produitable');
    }
    }
    <?php

    namespace App\Models;

    use Illuminate\Database\Eloquent\Model;

    class Produit extends Model
    {
    public function produitable()
    {
    return $this->morphTo();
    }
    public function souscategorie()
    {
    return $this->belongsTo('App\Models\Souscategorie', 'souscategories_id');
    }
    public function lignecommande()
    {
    return $this->hasMany('App\Models\Produit');
    }
    }
  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2285

    Salut,

    Je pense qu'on peut filtrer sur la relation :

    $unTreuil->produits()->whereActif(false)->get()
  • Avatar de XavierDlm
    Membre depuis :
    01/12/2017
    Messages :
    14

    J'ai tester votre code mais cela ne marche pas , je n'ai pas d'erreur mais je n'ai pa de changement ca reste un all(); sans filtre sur le fait qu'il soit actif ou non .

  • Avatar de XavierDlm
    Membre depuis :
    01/12/2017
    Messages :
    14

    Pour information le champ actif et un varchar et non un boolean car je le recupere d'une autre table qui me lenvoie en varchar .

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    230

    Et il est écrit "False" ? et non pas 0 ou 1 ....c'est quoi comme DB, si c'est False je pense à PostgreSQL, mais pas sur.

  • Avatar de XavierDlm
    Membre depuis :
    01/12/2017
    Messages :
    14

    C'est ecrit False ou True effectivement et non la base de donnée que j'extrait et une bd access , et vue qu'il est mis a jour automatiquement il falait qu'il correspondent au type de la bd access et donc un varchar . Pour resumer ma BD et Mysql et celle que j'extrait access , le champ actif et un varchar que j'utilise comme boolean .

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    230

    Et en adaptant le code de Bestmomo ?


    $unTreuil->produits()->where('actif' ,'=', 'False')->get()
  • Avatar de XavierDlm
    Membre depuis :
    01/12/2017
    Messages :
    14

    J'ai essayer aussi cette facon et comme ca aussi

    $LesTreuils=Treuil::all()
    ->produits()
    ->where('actif' , 'False')
    ->get()
  • Avatar de XavierDlm
    Membre depuis :
    01/12/2017
    Messages :
    14

    j'ai essayer dans l'autre sens du coup mais je suis bloquer aussi

    $LesTreuils = Produit::where('souscategories_id', 14)
    ->where ('actif', 'False')
    ->produitable()
    ->where('type','CF')
    ->get();

    Car type appartient a la table Glaciere donc ca revien au meme que quand je suis dans la table Glaciere et que je n'arrive pas a acceder au champ actif de la table produit ...

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    230

    Et vous ne voulez pas le faire avec une vraie requêtes SQL ?

  • Avatar de XavierDlm
    Membre depuis :
    01/12/2017
    Messages :
    14

    Ba sur Laravel il ya a Eloquent et j'aurait bien aimer reussir comme ca et surtout vue que c'est du polymorhphisme je n'ai pas de cle etrangere relier a l'autre table pour faire un inner join donc je sais pas si c'est possible .

  • Avatar de XavierDlm
    Membre depuis :
    01/12/2017
    Messages :
    14

    Toujours pas d'idées ?

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

    Je suis quand même curieux de savoir quelle requête est générée avec ça :

    $unTreuil->produits()->whereActif('False')->get()

Vous ne pouvez pas répondre à ce sujet.