表单与实体字段,保存在数据库稀有字符串中

时间:2013-07-31 11:05:28

标签: forms symfony twig arraycollection

我有这样的表格:

<?php
namespace FEB\TwitterBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class TwitterpostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('titulo')
                ->add('tweet', 'textarea')
                ->add('photo', 'file', array('required' => false))              
                ->add('tags', 'entity', array(
                                                'class' =>    'FEBTagsBundle:tag',
                                                'property' => 'tag',
                                                'empty_value' => 'Selecciona tags',
                                                'multiple' => true));               
    }
    public function getName()
    {
        return 'twitter_form';
    }
}

当我将其保存在我的数据库中时,字段“tag”保存此字符串:

Doctrine\Common\Collections\ArrayCollection@000000000b3d932100000000287ad87a

而不是属性“tag”的值,我的错误是什么? 或者相反,这是正确的,我必须在twig模板中显示纠正格式?

提前谢谢你。

EDIT1:

解决方案: 最后,我不得不修改我的twitterpost实体:

<?php

namespace FEB\TwitterBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Twitterpost
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="FEB\TwitterBundle\Entity\TwitterpostRepository")
 */
class Twitterpost
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="titulo", type="string", length=50)
     * @Assert\NotNull(message="Debe escribir un titulo")
     */
    private $titulo;

    /**
     * @var string
     *
     * @ORM\Column(name="tweet", type="string", length=145)
     * @Assert\NotNull(message="Debe escribir un tweet")
     */
    private $tweet;


  /**
   * Many-To-Many, Unidirectional
   *
   * @var ArrayCollection $tags
   *
   * @ORM\ManyToMany(targetEntity="\FEB\TagsBundle\Entity\tag")
   * @ORM\JoinTable(name="twitter_has_tag",
   *      joinColumns={@ORM\JoinColumn(name="twitter_id", referencedColumnName="id")},
   *      inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")}
   * )
   */
    private $tags;

      public function __construct()
   {
    $this->tags = new ArrayCollection();
   }


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set titulo
     *
     * @param string $titulo
     * @return Twitterpost
     */
    public function setTitulo($titulo)
    {
        $this->titulo = $titulo;

        return $this;
    }

    /**
     * Get titulo
     *
     * @return string 
     */
    public function getTitulo()
    {
        return $this->titulo;
    }

    /**
     * Set tweet
     *
     * @param string $tweet
     * @return Twitterpost
     */
    public function setTweet($tweet)
    {
        $this->tweet = $tweet;

        return $this;
    }

    /**
     * Get tweet
     *
     * @return string 
     */
    public function getTweet()
    {
        return $this->tweet;
    }

    /**
     * Set tags
     *
     * @param string $tags
     * @return Twitterpost
     */
    public function setTags($tags)
    {
        $this->tags = $tags;

        return $this;
    }

    /**
     * Get tags
     *
     * @return string 
     */
    public function getTags()
    {
        return $this->tags;
    }   
}

实体标记没有变化。

这些更改会生成下一个数据库表:
表:twitter_has_tag
    twitter_id
    TAG_ID

我认为没关系,不是吗?

1 个答案:

答案 0 :(得分:0)

您需要在Twitterposts和Tags实体之间建立ManyToMany关系。

你需要把这样的东西放到你的Twitter子实体:

/**
 * @ORM\ManyToMany(targetEntity="Tags", inversedBy="twitterposts")
 * @ORM\JoinTable(name="twitterpost_tags",
 *   joinColumns={@ORM\JoinColumn(name="twitterpost_id", referencedColumnName="id")},
 *   inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")}
 * )
 */
private $tags;

将其作为ArrayCollection:

public function __construct() {
    $this->tags = new ArrayCollection();
}

将getter和setter设置为此元素,并在Tags实体中执行另一方。

以下是Doctrine文档: http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html#many-to-many-unidirectional