Laravel France

Probleme avec polymorphisme Laravel

Avatar de XavierDlm
XavierDlm

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');
     }
}
Posté il y a 1 an
Avatar de bestmomo
bestmomo

Salut,

Je pense qu'on peut filtrer sur la relation :

$unTreuil->produits()->whereActif(false)->get()
Posté il y a 1 an
Avatar de XavierDlm
XavierDlm

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 .

Posté il y a 1 an
Avatar de XavierDlm
XavierDlm

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 .

Posté il y a 1 an
Avatar de MaitrePylos
MaitrePylos

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.

Posté il y a 1 an
Avatar de XavierDlm
XavierDlm

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 .

Posté il y a 1 an
Avatar de MaitrePylos
MaitrePylos

Et en adaptant le code de Bestmomo ?



$unTreuil->produits()->where('actif' ,'=', 'False')->get()


Posté il y a 1 an
Avatar de XavierDlm
XavierDlm

J'ai essayer aussi cette facon et comme ca aussi

$LesTreuils=Treuil::all()
->produits()
->where('actif' , 'False')
->get()
Posté il y a 1 an
Avatar de XavierDlm
XavierDlm

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 ...

Posté il y a 1 an
Avatar de MaitrePylos
MaitrePylos

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

Posté il y a 1 an
Avatar de XavierDlm
XavierDlm

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 .

Posté il y a 1 an
Avatar de XavierDlm
XavierDlm

Toujours pas d'idées ?

Posté il y a 1 an
Avatar de bestmomo
bestmomo

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

$unTreuil->produits()->whereActif('False')->get()
Posté il y a 1 an
Avatar de XavierDlm
XavierDlm

Bonjour , je n'avait pas repondu au message car ca ne renvoyait rien jai juste une erreur marquant methods produits doesn't exist , mais javait reussi a "contourner" le probleme . Mais aujourd'hui je peut plus le contourner il faut que je trouve une solution pour que je puisse passer de ma table produits a une autre table dans le controller ou inverse , donc j'aurait aimer savoir si vous auriez pas d'autre idée car $unTreuil->produits()->whereActif('False')->get() ne fonctionne pas du tout et j'ai essayer dans les deux sens $lesProduit->produitable()->orderby('marque','asc')->get() qui me renvoie methods produitable ne marche pas . Il doit bien avoir une solution :/ sinon a quoi servirait le polymorhphisme .

Posté il y a 1 an

Vous ne pouvez pas répondre à ce sujet.