2013-08-13 2 views
0

У меня есть, что Entity TwitterPost.phpЛучший подход, чтобы получить форму объект поля из базы данных

<?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") 
* @ORM\HasLifecycleCallbacks() 
*/ 
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="twitterpost_tags", 
    *  joinColumns={@ORM\JoinColumn(name="twitterpost_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="tag", referencedColumnName="id")} 
    *) 
    */ 
    private $tags; 


    /** 
    * @var string 
    * 
    * @ORM\Column(name="photo", type="string", length=255, nullable=true) 
    */ 
    private $photo; 


    /** 
    * @var string 
    * 
    * @ORM\Column(name="idpost", type="string", length=100) 
    */ 
    private $idpost; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="autor", type="string", length=50) 
    */ 
    private $autor; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="created", type="datetime") 
    */ 
    private $created; 


    public function __construct() 
    { 
     $this->setCreated(new \DateTime()); 
     $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; 
    } 

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

     return $this; 
    } 

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

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

     return $this; 
    } 

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

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

     return $this; 
    } 

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

    /** 
    * Set created 
    * 
    * @param \DateTime $created 
    * @return Tag 
    */ 
    public function setCreated($created) 
    { 
     $this->created = $created; 

     return $this; 
    } 

    /** 
    * Get created 
    * 
    * @return \DateTime 
    */ 
    public function getCreated() 
    { 
     return $this->created; 
    } 
} 

И это один

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

    /** 
    * @var string 
    * 
    * @ORM\Column(name="tag", type="string", length=255) 
    */ 
    private $tag; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="autor", type="string", length=50) 
    */ 
    private $autor; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="created", type="datetime") 
    */ 
    private $created; 

    public function __construct() 
    { 
     $this->setCreated(new \DateTime()); 
    } 


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

    /** 
    * Set tag 
    * 
    * @param string $tag 
    * @return Tag 
    */ 
    public function setTag($tag) 
    { 
     $this->tag = $tag; 

     return $this; 
    } 

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

    /** 
    * Set autor 
    * 
    * @param string $autor 
    * @return Tag 
    */ 
    public function setAutor($autor) 
    { 
     $this->autor = $autor; 

     return $this; 
    } 

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

    /** 
    * Set created 
    * 
    * @param \DateTime $created 
    * @return Tag 
    */ 
    public function setCreated($created) 
    { 
     $this->created = $created; 

     return $this; 
    } 

    /** 
    * Get created 
    * 
    * @return \DateTime 
    */ 
    public function getCreated() 
    { 
     return $this->created; 
    } 
} 

Это Manytomany отношения между TwitterPost и тегами. И в моей форме есть поле выбора, которое является тегом класса Entity.

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

Когда я отправить форму данных, в таблице «twitterpost» данные сохранены правильно и в Окс стол «twitterpost_tags» тоже.

Например:

twitterpost_id tag_id 
1-----------1 
1-----------2 
2-----------1 
2-----------3 
The tag table: 
id---------tag 
1----------tagA 
2----------tagB 
3----------tagC 

Когда я хочу показать все данные Twitterpost, что это лучший подошел, чтобы показать имя тега, а не идентификатор тега?

Чем вы продвигаетесь вперед.

+0

Интересно, есть ли способ вставить в базу данных этого: 'twitterpost_id tag_id 1 ----------- tagA 1 ----------- tagB 2 ----------- tagA 2 ------- ----- tagC' Вместо этого: 'twitterpost_id tag_id 1 ----------- 1 1 ----------- 2 2 ----------- 1 2 ----------- 3' – cmaciasg

ответ

0

Я не уверен, если я получу вас правильно. Для того, чтобы показать всем тегов в виде twitterpost вы уже делаете правильную вещь:

->add('tags', 'entity', array(
      'class' => 'FEBTagsBundle:tag', 
      'property' => 'tag', 
      'empty_value' => 'Selecciona tags', 
      'multiple' => true 
)); 

Это создаст несколько выберите окно, в котором вы можете выбрать из всех тегов. От the docs:

property

type: string

This is the property that should be used for displaying the entities as text in the HTML element. If left blank, the entity object will be cast into a string and so must have a __toString() method.

Если вы не хотите множественного выбора но флажков или радиокнопки вместо фотографии this part of the documentation.


В случае, если вы спрашиваете о том, как выводить данные, когда не внутри TwitterpostType, вы можете рассматривать их как объекты в контроллере:

$repository = $this->getDoctrine()->getRepository('TwitterBundle:Twitterpost'); 
$post = $repository->findOne($id); 

// to get all _tags_ of a post just call the getter: 
$tags = $post->getTags(); 

То же самое идет для веточки шаблоны:

{# imagine you have all posts in a variable called 'posts' #} 
{% for post in posts %} 
    <h1>{{ post.titulo }}</h1> 
    <div class="tags"> 
     {% for tag in posts.tags %} 
     {{ tag.tag }} 
     {% endfor %} 
    </div> 
{% endfor %} 

Редактировать:

Для собственного SQL/DQL-запроса вам нужно a custom repository class.Там вы можете хранить свои собственные запросы:

class TwitterpostRepository extends EntityRepository 
{ 
    public function findAllOrderedByName() 
    { 
     return $this->getEntityManager() 
      ->createQuery(
       'SELECT p FROM TwitterBundle:Twitterpost p ORDER BY p.name ASC' 
      ) 
      ->getResult(); 
    } 
} 

Затем вы можете использовать его, как это в контроллере:

$repository = $this->getDoctrine()->getRepository('TwitterBundle:Twitterpost'); 
$post = $repository->findAllOrderedByName(); 
+0

Прежде всего, благодарю вас за Ваш ответ. Да, я имел в виду, как вывести данные и работает отлично. Но у меня есть вопрос. Этот подход хорош, когда я хочу вывести данные типа, хорошо, что если бы я хотел сделать NativeSql, как UNION вместо findOne()? В этом случае я не мог использовать этот метод, нет? – cmaciasg

+0

Я обновил свой ответ – ferdynator

+0

:) Отлично, byf-ferdy. Ты трещина !!! Спасибо – cmaciasg

Смежные вопросы