0
votes

Relation de plusieurs fois avec Symfony 3.4 (créer un lien entre deux tables avec API)

J'essaie de créer un lien entre deux tables avec une relation de nombreusesTomanany en symfony. J'ai une table de poste avec est essentiellement une table pour stocker tous les utilisateurs d'utilisateurs (comme Facebook Post, avec des commentaires, des goûts, des utilisateurs, etc.) et j'ai également une table de balises qui stocke toutes les étiquettes différentes créées par les utilisateurs. La relation de plustomanie est de m'aider à avoir un lien entre le poste et ses balises.

Cela fonctionne bien pour les utilisateurs mentionnés qui fonctionnent exactement de la même manière que les balises. (Les utilisateurs mentionnés sont comme les tags, mais vous ne pouvez étique que des étiquettes). Les balises réelles sont censées donner aux utilisateurs la possibilité de marquer des événements et des entreprises au poste. Ils seront alors en mesure de rechercher toutes les balises existantes, un peu comme Instagram. p>

Voici mon entité d'étiquette: p> xxx pré>

voici ma post entité: p> xxx pré>

ici est également mon utilisateur utilisateur qui fonctionne bien avec l'entité post-entité: p> xxx pré>

Voici un extrait de mes contrôleurs qui gèrent la relation entre le poste et les balises lorsque le poste est créé. : P>

 /**
     * @Rest\Post(
     *     path="posts",
     *     name="post_creation"
     * )
     * @Rest\RequestParam(
     *     name="content",
     *     description="content of post"
     * )
     * @Rest\RequestParam(
     *     name="postType",
     *     description="type of post: text, image, video or gallery"
     * )
     *
     * @Rest\View(serializerGroups={"post_creation"})
     */
    public function postCreateAction(Request $request)
    {
        $text = $this->getDoctrine()->getRepository(PostType::class)->find('1');
        $image = $this->getDoctrine()->getRepository(PostType::class)->find('2');
        $video = $this->getDoctrine()->getRepository(PostType::class)->find('3');
        //$gallery = $this->getDoctrine()->getRepository(PostType::class)->find('4');

        $em = $this->getDoctrine()->getManager();

        //$title = $request->request->get('title');
        $content = $request->request->get('content');
        $postType = $request->request->get('postType');

        if ($content == null) {
            return new JsonResponse('invalid post');
        }
        $post = new Post();
        $now = new DateTime('now');

        switch ($postType) {
            case text_type:
                $user = $this->getUser()->getUser();
                $post->setClub($user->getCurrentClub());
                $post->setPostType($text);
                $post->setCreateDate($now);
                $post->setContent($content);
                $post->setUser($user);
                $em->persist($post);
                $em->flush();
                $post_tags = json_decode($request->request->get('tags'), true);

                if ($post_tags != null) {
                    foreach ($post_tags as $post_tag) {
                        $tag = $this->getDoctrine()->getRepository(Tag::class)->findOneBy(['libelle' => $post_tag]);
                        if ($tag == null) {
                            $new_tag = new Tag();
                            $new_tag->setLibelle($post_tag);
                            $em->persist($new_tag);
                            $em->flush();
                            $post->getTags()->add($new_tag);

                        } else {
                            $post->getTags()->add($tag);
                            $em->flush();
                        }
                    }
                }

                //handle mentioned users
                $mentioned_users_id = json_decode($request->request->get('mentioned_users_id'), true);
                if ($mentioned_users_id != null) {
                    foreach ($mentioned_users_id as $mentioned_user_id) {
                        $mentioned_user_input = $this->getDoctrine()->getRepository(User::class)->findOneBy(['id' => $mentioned_user_id]);
                        if ($mentioned_user_input != null) {
                            $post->getMentionedUsers()->add($mentioned_user_input);
                        }
                    }
                }

                $em->flush();
                return $post;
                break;

            case image_type:
                $filePath = tempnam(sys_get_temp_dir(), 'UploadedFile');
                $file = fopen($filePath, "w");
                stream_filter_append($file, 'convert.base64-decode');
                fwrite($file, $request->request->get('attachment'));
                $meta_data = stream_get_meta_data($file);
                $path = $meta_data['uri'];
                fclose($file);
                $fileName = $this->getUser()->getId() . "_" . uniqid() . '.' . $request->request->get("ext");
                $new_path = $this->getParameter('post_directory') . $fileName;
                rename($path, $new_path);
                $user = $this->getUser()->getUser();
                $post->setClub($user->getCurrentClub());
                $post->setPostType($image);
                $post->setCreateDate($now);
                $post->setContent($content);
                $post->setUser($user);
                $post->setAttachment($fileName);
                $em = $this->getDoctrine()->getManager();
                $em->flush();
                return $post;

            case video_type:
                $video_file = $request->request->get('attachment');
                $user = $this->getUser()->getUser();
                $post->setClub($user->getCurrentClub());
                $post->setPostType($video);
                $post->setCreateDate($now);
                $post->setContent($content);
                $post->setUser($user);
                $post->setAttachment($video_file);
                $em = $this->getDoctrine()->getManager();
                $em->flush();
                return $post;

            //case gallery_type:
            //    $gallery_file_array = [];
            //    $gallery_array = explode(',', $request->request->get('attachment'));
            //    foreach ($gallery_array as $image) {
            //        if ($image) {
            //            $filePath = tempnam(sys_get_temp_dir(), 'UploadedFile');
            //            $file = fopen($filePath, "w");
            //            stream_filter_append($file, 'convert.base64-decode');
            //            fwrite($file, $image);
            //            $meta_data = stream_get_meta_data($file);
            //            $path = $meta_data['uri'];
            //            fclose($file);
            //            $fileName = $this->getUser()->getId() . "_" . uniqid() . '.' . $request->request->get("ext");
            //            $new_path = $this->getParameter('post_directory') . $fileName;
            //            rename($path, $new_path);
            //            $gallery_file_array[] = $fileName;
            //        }
            //    }
//
            //    if (count($gallery_file_array)) {
            //        $post->setAttachment(json_encode($gallery_file_array));
            //        $current_user = $this->getUser()->getUser();
            //        $post->setClub($this->getUser()->getManager()->getClub());
            //        $post->setPostType($gallery);
            //        $post->setCreateDate($now);
            //        $post->setTitle($title);
            //        $post->setContent($content);
            //        $post->setUser($current_user);
            //        $em = $this->getDoctrine()->getManager();
            //        $em->persist($post);
            //        $em->flush();
            //        return $post;
            //    }
            //    break;
            default:
                return new JsonResponse('post creation invalid');
        }
    }


0 commentaires

3 Réponses :


0
votes

Les balises sont enregistrées car elles sont persistées individuellement sur la boucle.

Pour enregistrer des entités intermédiaires (Tables de relation) sans appeler persist () sur la table intermédiaire, vous devez utiliser cascade = {"persister"} sur votre définition de plusieurs tomanany.

https://www.doctrine-project.org/projects/doctrine-orm/fr/2.6/Reference/working-with-associations.html#transitive-persistence-cascade-pérations


2 commentaires

Merci pour votre réponse rapide. Je vais essayer votre solution et vous tenir au courant.


Hey encore, j'ai essayé votre solution mais pas de chance, j'ai toujours le même problème. J'ai besoin de les persister individuellement en boucle car si les tags n'existent pas, je dois les créer, puis les lier avec mon poste. Merci de toute façon ;)



0
votes

Vous devez ajouter une méthode dans la poste d'entité postale pour lier les balises à la poste: xxx pré>

et ajouter une étiquette comme celle-ci: p>

$post->addTag($new_tag);


5 commentaires

Merci encore pour vos réponses rapides. Je vais essayer maintenant et vous tenir au courant. Cependant, je ne reçois pas ce qui change entre votre "$ ceci-> tags-> ajouter ($ tag)" et mon "$ post-> getTags () -> ajouter ($ new_tag);". Pour moi c'est la même chose. Je le fais comme si parce que je sais que toutes mes tags existent depuis que je suis déjà en boucle avant que cela vérifie si elles existent et, sinon, je les crée. Cela ne résout pas vraiment mon problème ici.


Estève signifie que au lieu de $ post-> getTags () -> Ajouter ($ new_tag); Vous pouvez créer la méthode qu'il a affichée. Peut-être que celles-ci ne persistent pas la poste ni des tags après avoir été ajouté à la poste $ post-> getTags () -> Ajouter ($ new_tag); Vous persistez et rinçage $ POST avant attribuer des balises.


Bonjour, j'ai juste essayé votre solution, je ne travaille toujours pas. Le fait de persister le post avant ou après avoir attribué les balises à cela ne doit pas modifier ou interférer comment la base de données enregistre le lien entre mes deux tables. Merci de toute façon pour votre aide!


Peut-être que vous pouvez simplement définir le message lorsque vous créez la nouvelle étiquette comme: NEW_TAG-> SETLIBELLE ($ post_tag); $ new_tag-> addpost ($ post)


Je ne peux pas faire cela parce que la poste est le propriétaire et non. La balise est créée si elle n'existe pas déjà et persistait dans la base de données. Le problème est que la doctrine n'a pas enregistré / crée le lien dans ma table Post_HAS_TAG. Je pense que c'est une erreur de doctrine.



0
votes

mise à jour: j'ai finalement réussi à corriger mon bogue. J'ai essentiellement régénéré toutes mes entités et recréé ma table POST_HAS_TAG (recréant également tous les liens) et fonctionnait à nouveau. N'ont pas encore trouvé la source du bug. Je vais essayer de mettre à jour cette question à l'avenir si je trouve pourquoi cette question s'est produite. Merci encore pour votre aide!


0 commentaires