Partage
  • Partager sur Facebook
  • Partager sur Twitter

ManyToOne Symfony3 Doctrine

18 novembre 2017 à 13:02:51

Bonjour, je rencontre des problèmes à récupérer une entité Provider depuis un manyToOne, la relation c'est bien faite, l'id Provider est récupéré, seulement le reste vaut null. Une image vaut mieux que des mots.

L'entité Product avec sa liaison manyToOne :

/**
 * @Entity @Table(name="product")
 */
class Product
{

    /**
     * @Id
     * @Column(type="string", name="reference_produit")
     */
    protected $id;

    /**
     * @Column(type="string", name="designation_longue_du_produit")
     */
    protected $designationLongue;

    /**
     * @Column(type="string", name="designation_courte_du_produit")
     */
    protected $designationCourte;

    /**
     * @Column(type="string", name="code_a_barre")
     */
    protected $barCode;

    /**
     * @ManyToOne(targetEntity="Provider")
     * @JoinColumn(name="code_fournisseur_principal", referencedColumnName="code_fournisseur")
     */
    protected $idProvider;
}

L'entité Provider : 

/**
 * @Entity @Table(name="provider")
 */
class Provider
{
    /**
     * @Id
     * @Column(type="string", name="code_fournisseur")
     */
    protected $id;

    /**
     * @Column(type="string", name="Enseigne")
     */
    protected $provider;

    /**
     * @Column(type="string", name="Ville")
     */
    protected $city;

    /**
     * @Column(type="string", name="Code_postal")
     */
    protected $zip;

    /**
     * @Column(type="string", name="Code_devise_fournisseur")
     */
    protected $devise;

    /**
     * @Column(type="string", name="Telephone")
     */
    protected $phone;

    /**
     * @Column(type="string", name="Email")
     */
    protected $email;

}



Le code dans le controller : 

        $repository = $this->getManager($session->get('em'),$session->get('struct'))->getRepository('AppBundle\Entity\Colombus\Product')->findById("602391");
        dump($repository);

Merci d'avance

-
Edité par SofianGhérabi 18 novembre 2017 à 13:04:03

  • Partager sur Facebook
  • Partager sur Twitter
18 novembre 2017 à 13:14:56

Bonjour,

D'abord ce n'est pas très bon de mettre idProvider dans l'entité Product car en fait c'est bien un objet Provider qui est lié.

Ensuite que donne dans une vue par exemple ?

{{ repository.city }}


C'est bien un objet qui est lié.

A+

  • Partager sur Facebook
  • Partager sur Twitter
18 novembre 2017 à 13:28:12

Merci pour votre réponse, mon dump semble être bugé car autant en passant par les getter, cela fonctionne 

{{ repository.idProvider.city }}

Un produit appartient à un fournisseur, je suis obliger de mettre idProvider dans l'entité Product, si je veux pouvoir récupérer le nom du fournisseur lié au produit.

sinon, pourquoi mon dump ne récupère pas les infos ?

  • Partager sur Facebook
  • Partager sur Twitter
18 novembre 2017 à 16:02:24

Je pense que tu n'as pas bien saisi le paradigme de Symfony.

Quand tu fais une relation entre entité, la propriété dans l'entité en relation est en relation avec l'objet. Donc ce n'est pas juste conceptuellement de mettre idProvider. Tu devrais mettre comme propriété $provider tout court.

Après effectivement si tu regardes les tables générées, oui tu as l'id du Provider dans la table Product mais c'est du modèle logique voire physique.

Et cela normalement tu ne t'en occupes pas puisque c'est l'orm qui se débrouille.

Pourquoi n'as tu pas mis var_dump dans ton contrôleur ? ligne 2 de ton code dans le post dit contrôleur.

Tu fais dump dans un twig.

A+

-
Edité par monkey3d 18 novembre 2017 à 16:04:06

  • Partager sur Facebook
  • Partager sur Twitter
18 novembre 2017 à 16:37:15

Pourrais-tu donner un exemple car je ne comprend pas vraiment ta phrase, $idProvider c'est l'objet, faut bien pouvoir acceder à ces attributs.

On a un objet produit, qui possède ces attributs mais qui contient dedans un objet idProvider.

  • Partager sur Facebook
  • Partager sur Twitter
18 novembre 2017 à 16:45:09

On est d'accord que tu accèdes à l'objet Provider à partir de la propriété qui est dans Product : c'est peut-être juste une question de dénomination mais derrière la dénomination c'est une manière de penser. Avec Symfony, tu penses Entité et relation entre Entités ... tu ne penses pas identifiant et clef étrangère ... pour cela tu laisses faire l'ORM.

Or ton $idProvider comme tu l'as nommé, cela fait penser à une clef étrangère. Donc tu devrais plutôt le nommer $provider et ainsi c'est clair que :

product.provider tu accèdes à l'objet Provider à partir de Product.

Tu te moques que pour cela l'ORM a placé l'identifiant de Provider dans Product c'est à dire une clef étrangère.

:D

A+

-
Edité par monkey3d 18 novembre 2017 à 16:46:44

  • Partager sur Facebook
  • Partager sur Twitter
18 novembre 2017 à 16:50:48

Donc c'est juste une question de nommage de l'attribut

repository.provider.city car repository.city ne marche pas.

  • Partager sur Facebook
  • Partager sur Twitter
18 novembre 2017 à 17:02:19

Pas seulement de nommage, il y a une vraie démarche de penser : tu n'as pas une propriété qui est un id ... mais une propriété qui est l'objet.

Exact repository.provider.city ... j'avais fait une erreur que j'ai rectifié en relisant.

C'est le jeu des poupées russes : tu pars d'une entité pour aller à une autre et pour accéder à sa (ses) propriété(s).

A+

  • Partager sur Facebook
  • Partager sur Twitter