Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][SF2] Problem z dodaniem rekordu w relacji wiele do wielu
Forum PHP.pl > Forum > PHP > Frameworki
m.e.n.t.o.s.
Witam

Próbuję zrobić dodawanie rekordu dla relacji wiele do wielu i dostaje błąd. Nie mam pojęcia jak to ugryźć. Ale po kolei:

Entity article:
  1. <?php
  2.  
  3. namespace Portal\CmsBundle\Entity;
  4.  
  5. use Doctrine\ORM\Mapping as ORM;
  6. use Doctrine\Common\Collections\ArrayCollection;
  7.  
  8. /**
  9.  * Article
  10.  *
  11.  * @ORM\Table()
  12.  * @ORM\Entity
  13.  */
  14. class Article
  15. {
  16. /**
  17.   * @ORM\OneToMany(targetEntity="ArticleTag", mappedBy="article")
  18.   */
  19. protected $articleTags;
  20.  
  21. public function __construct()
  22. {
  23. $this->articleTags = new ArrayCollection();
  24. }
  25.  
  26. /**
  27.   * @var integer
  28.   *
  29.   * @ORM\Column(name="id", type="integer")
  30.   * @ORM\Id
  31.   * @ORM\GeneratedValue(strategy="AUTO")
  32.   */
  33. private $id;
  34.  
  35. /**
  36.   * Get id
  37.   *
  38.   * @return integer
  39.   */
  40. public function getId()
  41. {
  42. return $this->id;
  43. }
  44.  
  45. /**
  46.   * Add articleTags
  47.   *
  48.   * @param \Portal\CmsBundle\Entity\ArticleTag $articleTags
  49.   * @return Article
  50.   */
  51. public function addArticleTag(\Portal\CmsBundle\Entity\ArticleTag $articleTags)
  52. {
  53. $this->articleTags[] = $articleTags;
  54.  
  55. return $this;
  56. }
  57.  
  58. /**
  59.   * Remove articleTags
  60.   *
  61.   * @param \Portal\CmsBundle\Entity\ArticleTag $articleTags
  62.   */
  63. public function removeArticleTag(\Portal\CmsBundle\Entity\ArticleTag $articleTags)
  64. {
  65. $this->articleTags->removeElement($articleTags);
  66. }
  67.  
  68. /**
  69.   * Get articleTags
  70.   *
  71.   * @return \Doctrine\Common\Collections\Collection
  72.   */
  73. public function getArticleTags()
  74. {
  75. return $this->articleTags;
  76. }
  77. }


Entity tag:
  1. <?php
  2.  
  3. namespace Portal\CmsBundle\Entity;
  4.  
  5. use Doctrine\ORM\Mapping as ORM;
  6. use Doctrine\Common\Collections\ArrayCollection;
  7.  
  8. /**
  9.  * Tag
  10.  *
  11.  * @ORM\Table()
  12.  * @ORM\Entity
  13.  */
  14. class Tag
  15. {
  16. /**
  17.   * @ORM\OneToMany(targetEntity="ArticleTag", mappedBy="tag")
  18.   */
  19. protected $articleTags;
  20.  
  21. public function __construct()
  22. {
  23. $this->articleTags = new ArrayCollection();
  24. }
  25.  
  26. /**
  27.   * @var integer
  28.   *
  29.   * @ORM\Column(name="id", type="integer")
  30.   * @ORM\Id
  31.   * @ORM\GeneratedValue(strategy="AUTO")
  32.   */
  33. private $id;
  34.  
  35. /**
  36.   * Get id
  37.   *
  38.   * @return integer
  39.   */
  40. public function getId()
  41. {
  42. return $this->id;
  43. }
  44.  
  45. /**
  46.   * Add articleTags
  47.   *
  48.   * @param \Portal\CmsBundle\Entity\ArticleTag $articleTags
  49.   * @return Tag
  50.   */
  51. public function addArticleTag(\Portal\CmsBundle\Entity\ArticleTag $articleTags)
  52. {
  53. $this->articleTags[] = $articleTags;
  54.  
  55. return $this;
  56. }
  57.  
  58. /**
  59.   * Remove articleTags
  60.   *
  61.   * @param \Portal\CmsBundle\Entity\ArticleTag $articleTags
  62.   */
  63. public function removeArticleTag(\Portal\CmsBundle\Entity\ArticleTag $articleTags)
  64. {
  65. $this->articleTags->removeElement($articleTags);
  66. }
  67.  
  68. /**
  69.   * Get articleTags
  70.   *
  71.   * @return \Doctrine\Common\Collections\Collection
  72.   */
  73. public function getArticleTags()
  74. {
  75. return $this->articleTags;
  76. }
  77. }


Entity ArticleTag:
  1. <?php
  2.  
  3. namespace Portal\CmsBundle\Entity;
  4.  
  5. use Doctrine\ORM\Mapping as ORM;
  6. use Doctrine\Common\Collections\ArrayCollection;
  7.  
  8. /**
  9.  * ArticleTag
  10.  *
  11.  * @ORM\Table(name="article_tag")
  12.  * @ORM\Entity
  13.  */
  14. class ArticleTag
  15. {
  16. /**
  17.   * @ORM\ManyToOne(targetEntity="Article", inversedBy="articleTags")
  18.   * @ORM\JoinColumn(name="article_id", referencedColumnName="id")
  19.   *
  20.   * @ORM\Column(name="article_id", type="integer")
  21.   * @ORM\Id
  22.   * @ORM\GeneratedValue(strategy="NONE")
  23.   */
  24. protected $article;
  25.  
  26. /**
  27.   * @ORM\ManyToOne(targetEntity="Tag", inversedBy="articleTags")
  28.   * @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
  29.   *
  30.   * @ORM\Column(name="tag_id", type="integer")
  31.   * @ORM\Id
  32.   * @ORM\GeneratedValue(strategy="NONE")
  33.   */
  34. protected $tag;
  35.  
  36. public function __construct($article, $tag)
  37. {
  38. $this->article = $article;
  39. $this->tag = $tag;
  40. }
  41.  
  42. /**
  43.   * Set article
  44.   *
  45.   * @param \Portal\CmsBundle\Entity\Article $article
  46.   * @return ArticleTag
  47.   */
  48. public function setArticle(\Portal\CmsBundle\Entity\Article $article = null)
  49. {
  50. $this->article = $article;
  51.  
  52. return $this;
  53. }
  54.  
  55. /**
  56.   * Get article
  57.   *
  58.   * @return \Portal\CmsBundle\Entity\Article
  59.   */
  60. public function getArticle()
  61. {
  62. return $this->article;
  63. }
  64.  
  65. /**
  66.   * Set tag
  67.   *
  68.   * @param \Portal\CmsBundle\Entity\Tag $tag
  69.   * @return ArticleTag
  70.   */
  71. public function setTag(\Portal\CmsBundle\Entity\Tag $tag = null)
  72. {
  73. $this->tag = $tag;
  74.  
  75. return $this;
  76. }
  77.  
  78. /**
  79.   * Get tag
  80.   *
  81.   * @return \Portal\CmsBundle\Entity\Tag
  82.   */
  83. public function getTag()
  84. {
  85. return $this->tag;
  86. }
  87. }


Akcja w kontrolerze do dodania tagu:
  1. <?php
  2.  
  3. namespace Portal\CmsBundle\Controller;
  4.  
  5. use Portal\CmsBundle\Entity\Tag;
  6. use Portal\CmsBundle\Entity\ArticleTag;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Doctrine\ORM\EntityRepository;
  9.  
  10. class AdminTagsController extends AbstractController
  11. {
  12. public function addAction(Request $request)
  13. {
  14. if ($request->getMethod() == 'POST') {
  15. $tag = new Tag();
  16. $em = $this->getDoctrine()->getManager();
  17.  
  18. $formArray = $request->request->get('formTag');
  19.  
  20. $repository = $em->getRepository('PortalCmsBundle:Article');
  21.  
  22. $validator = $this->get('validator');
  23. $errors = $validator->validate($tag);
  24.  
  25. if (count($errors) > 0) {
  26. foreach ($errors as $error) {
  27. $this->message .= $error->getPropertyPath().' <-- '.$error->getMessage().'
  28. ';
  29. }
  30. } else {
  31. $em->persist($tag);
  32. $em->flush();
  33.  
  34. foreach ($formArray['articles'] as $article_id) {
  35. $article = $repository->find((int)$article_id);
  36. $article_tag = new ArticleTag($article, $tag);
  37. $em->persist($article_tag);
  38. $em->flush();
  39. }
  40.  
  41. $this->message = 'Tag dodany';
  42. }
  43.  
  44. return $this->redirect($this->generateUrl(
  45. 'admin_tags',
  46. 'message' => $this->message,
  47. 'messageType' => $this->messageType
  48. )
  49. ));
  50. }
  51.  
  52. return $this->redirect($this->generateUrl(
  53. 'admin_tags'
  54. ));
  55. }
  56. }



Przy próbie dodania tagu wyrzuca mi taki ekran:
Kod
Whoops, looks like something went wrong.

1/1ContextErrorException: Catchable Fatal Error: Object of class Portal\CmsBundle\Entity\Article could not be converted to string in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 1359
in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 1359
at ErrorHandler->handle('4096', 'Object of class Portal\CmsBundle\Entity\Article could not be converted to string', 'C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php', '1359', array('entity' => object(ArticleTag), 'classMetadata' => object(ClassMetadata)))
at implode(' ', array('article' => object(Article), 'tag' => object(Tag))) in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 1359
at UnitOfWork->addToIdentityMap(object(ArticleTag)) in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 1172
at UnitOfWork->scheduleForInsert(object(ArticleTag)) in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 864
at UnitOfWork->persistNew(object(ClassMetadata), object(ArticleTag)) in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 1627
at UnitOfWork->doPersist(object(ArticleTag), array('000000002119541b000000007e966e3c' => object(ArticleTag))) in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php line 1583
at UnitOfWork->persist(object(ArticleTag)) in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php line 624
at EntityManager->persist(object(ArticleTag)) in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\src\Portal\CmsBundle\Controller\AdminTagsController.php line 128
at AdminTagsController->addAction(object(Request))
at call_user_func_array(array(object(AdminTagsController), 'addAction'), array(object(Request))) in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\app\bootstrap.php.cache line 2891
at HttpKernel->handleRaw(object(Request), '1') in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\app\bootstrap.php.cache line 2865
at HttpKernel->handle(object(Request), '1', true) in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\app\bootstrap.php.cache line 2994
at ContainerAwareHttpKernel->handle(object(Request), '1', true) in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\app\bootstrap.php.cache line 2274
at Kernel->handle(object(Request)) in C:\BitNami\wappstack-5.4.22-0\apache2\htdocs\cms\web\app_dev.php line 28


Wywala się na linii:
$em->persist($article_tag);

Dumpowałem obiekt $article_tag oraz obiekty $article i $tag, są w porządku.

Ktoś ma jakiś pomysł? Jeśli potrzebujecie więcej informacji z kodu to mówcie co.
ohm
A co wynika z doctrine:schema:validate ?
m.e.n.t.o.s.
Problem już rozwiązany smile.gif

http://symfonylab.pl/forum/index.php/topic,612.0.html
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.