2013-07-31 2 views
0

Я эту форму:форма с полем объекта, сохраняются в базе данных редкой строки

<?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'; 
    } 
} 

Когда я сохранить его в моей базе данных, поле «метка» сохранить эту строку:

Doctrine\Common\Collections\[email protected] 

а не значение свойства «тег», какова моя ошибка? Или, наоборот, это правильно, и я должен показать его в правильной форме шаблона ветви?

Заранее спасибо.

Edit1:

Решение: Наконец, я должен был изменить только мой twitterpost Entity:

<?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; 
    } 
} 

Тег Entity не имеет каких-либо изменений.

что изменения порождают следующую таблицу базы данных:
Таблица: twitter_has_tag
twitter_id
tag_id

Я думаю, что все в порядке, нет?

+0

Пожалуйста вывесить вас Twitterpost определение объекта. Вероятно, это связано с тем, что вы сохраняете объекты в одном поле, вместо того, чтобы иметь связанный объект. – saamorim

+0

Благодарим вас за ответ, @saamorim. Post Edited Идея заключается в сохранении строкового поля объекта twitterpost под названием «теги», имя тега, разделенное запятыми. – cmaciasg

ответ

0

Вам нужно сделать ManyToMany отношения между Twitterposts и объектом Tags.

Вам нужно положить что-то вроде этого в вас Twitterposts объект:

/** 
* @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(); 
} 

Make геттер и сеттер к этому элементу и сделать другую сторону слишком в вашем объекте Tags.

Вот документация Учение: http://docs.doctrine-project.org/en/2.0.x/reference/association-mapping.html#many-to-many-unidirectional

+0

Отлично, @jancso, я собираюсь попробовать это. – cmaciasg

+0

Сопоставление ассоциаций было бы Многим для многих однонаправленных или двунаправленных? – cmaciasg

+0

Я спрашиваю вас об этом, потому что если ассоциация является однонаправленной, я не должен ничего делать в объекте Tag, не так ли? – cmaciasg