IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Doctrine2 PHP Discussion :

@ORM\ManyToOne vers un autre entitymanager


Sujet :

Doctrine2 PHP

  1. #1
    Membre régulier Avatar de ToxiK
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 152
    Points : 73
    Points
    73
    Par défaut @ORM\ManyToOne vers un autre entitymanager
    Bonjour,

    j'ai un soucis pour lier une entité à une autre entité qui est dans un autre entitymanager.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    orm:
        entity_managers:
            default:
                connection: default
                mappings:
                    CharlyUserBundle: ~
            demo:
                connection: demo1
                mappings:
                    CharlyTestBundle: ~
    Voilà ce qu'il y a dans mon entité E1 du bundle Charly\TestBundle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /**
     * @ORM\ManyToOne(targetEntity="Charly\UserBundle\Entity\Utilisateur")
     * @ORM\JoinColumn(nullable=true)
     */
    private $responsable;
    Ça ne fonctionne pas dans la configuration actuelle, donc temporairement, j'ai mis CharlyUserBundle: ~ dans l'em demo, mais ça me créé une table Utilisateurs qui ne me sert pas...

    Est-il possible de faire cette liaison sans ajouter le bundle à l'em ?

  2. #2
    Membre régulier Avatar de ToxiK
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 152
    Points : 73
    Points
    73
    Par défaut
    up

  3. #3
    Membre régulier Avatar de ToxiK
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 152
    Points : 73
    Points
    73
    Par défaut
    je suis tombé sur un topic stipulant que ce n'était pas possible :

    Christophe Coevoet a écrit:

    You cannot map relations between entities that belong to different entity managers. Each EM is independent from the other. They don't know about the other ones. And btw, you cannot create database foreign key constraints between different databases either.

    La solution proposée est de gérer une relation entre MongoDB et ORM comme expliqué ici :

    http://docs.doctrine-project.org/pro...ngodb-odm.html

  4. #4
    Membre régulier Avatar de ToxiK
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 152
    Points : 73
    Points
    73
    Par défaut
    Comme je ne voulais pas utilisé cette solution j'ai fait du bricolage :

    Dans mon entity j'ai rajouté un objet qui contient l'utilisateur, mais qui n'est pas persisté, et je ne persiste que l'username.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    /**
     * BlogArticle
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="Charly\BaseBundle\Entity\ArticleRepository")
     * @ORM\HasLifecycleCallbacks
     */
    class Article
    {
     
        // Objet non persisté car EM différents
        /**
         * @Assert\NotNull()
         */
        private $auteur;
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $auteurUsername;
     
        /**
         * @ORM\PrePersist()
         * @ORM\PreUpdate()
         */
        public function recupereAuteurUsername()
        {
     
            if (null === $this->getAuteur()) {
    	    return;
            }
     
            $this->setAuteurUsername($this->getAuteur()->getUsername());
     
        }
     
    }
    Dans mon ArticleType :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
     
        $em = $options['em'];
        $emdefault = $options['emdefault'];
     
    ...
     
    ->add('auteur', 'entity', array(
        'class' => 'Charly\UserBundle\Entity\Utilisateur',
        'property' => 'PrenomNom',
        'em' => 'default',
        'choices'=> $this->getUtilisateurs($emdefault, $em)
        )
    )
     
    ...
     
    private function getUtilisateurs($emdefault, $em)
    {
        $liste = $emdefault->getRepository('Charly\UserBundle\Entity\Utilisateur')->getUtilisateursConnexion($em);
        return $liste;
    }
     
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setRequired(array(
    	'em',
    	'emdefault'
        ));
    }
     
    }
    Dans mon contrôleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $emdefault = $this->getDoctrine()->getManager("default");
     
    $form = $this->get('form.factory')->create(new ArticleType(), $article, array('emdefault' => $emdefault, 'em' => "connexion_client_1"));

    Il reste encore une chose à faire, récupérer l'objet auteur à partir de auteurUsername, une fois que l'objet est chargé

    Dans services.yml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    services:
        doctrine.listener.postload:
            class: Charly\AdminBundle\Listener\DoctrineListenerPostLoad
            arguments: ['@service_container']
            tags:
                - { name: doctrine.event_listener, event: postLoad }
    dans mon Listerner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    class DoctrineListenerPostLoad
    {
     
        protected $userManager;
     
        public function __construct(ContainerInterface $container){
            $this->container = $container;
        }
     
        public function postLoad(LifecycleEventArgs $args)
        {
            $entity = $args->getEntity();
     
            if($entity instanceof Article) {
     
                $userManager = $this->container->get('fos_user.user_manager');
     
                $utilisateur = $userManager->findUserByUsername($entity->getAuteurUsername());
     
                if($utilisateur) {
     
                    $entity->setAuteur($utilisateur);
     
                }	    
            }	    
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Copier d'une table vers une autre
    Par ph4prod dans le forum Bases de données
    Réponses: 4
    Dernier message: 07/09/2004, 13h42
  2. Copie du contenu d'un répertoire vers un autre
    Par IG88 dans le forum Windows
    Réponses: 4
    Dernier message: 30/07/2004, 15h33
  3. [débutante][API] basculer vers une autre appli en VB6
    Par zazaraignée dans le forum Windows
    Réponses: 7
    Dernier message: 04/06/2004, 16h15
  4. Transfert d'un CUBE OLAP d'un serveur vers un autre
    Par DAN#1 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/12/2003, 11h44
  5. [Répertoire] Copier vers un autre répertoire
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/09/2002, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo