Symfony2 ManyToMany встроенные формы - PullRequest
0 голосов
/ 12 марта 2012

В моем приложении есть сущность Post и Tag, и мне нужно много-много связей между ними.Я думаю, что справился, но не совсем уверен.Вот мои сущности:

Post:

/**
* @ORM\Table(name="posts")
*/
class Post
{
    ( ... )

    /**
    * @ORM\OneToMany(targetEntity="PostTag", mappedBy="post_id")
    */
    private $tags;

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

    ( ... )
}

Tag:

class Tag
{
    /**
     * @ORM\Column(name="tagname", unique=true, type="string", length=255)
     */
    private $tagname;

    /**
     * @ORM\OneToMany(targetEntity="PostTag", mappedBy="tag_id")
     */
    private $posts;

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

    ( ... )
}

Я также создал сущность PostTag для хранения этих отношений:

/**
* @ORM\Table(name="post_tags")
* @ORM\Entity
*/
class PostTag
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Post", inversedBy="tags")
     * @ORM\JoinColumn(name="post_id", referencedColumnName="id")
     */
    private $post_id;

    /**
     * @ORM\ManyToOne(targetEntity="Tag", inversedBy="posts")
     * @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
     */
    private $tag_id;

    ( ... )
}

Конечно, все 3 с соответствующими получателями / установщиками.С этими отношениями все в порядке?

Полагаю, я правильно понял, но сейчас я изо всех сил пытаюсь создать встроенную форму для сущности Post.Мне нужно создать поле тегов в PostType, где можно было бы ввести теги, которые сохраняются в таблице тегов, а также идентификатор только что созданного тега и записи в таблице post_tags.Я также хочу, чтобы уже сохраненные теги можно было выбирать в другом поле, поэтому я создаю сущности таким образом.

Я пытался написать это, но действительно запутался с плохими кодами, поэтому я даже непопробуйте скопировать то, что у меня было.Может кто-нибудь кратко просветить меня, как мне это сделать?

Спасибо

1 Ответ

4 голосов
/ 13 марта 2012

Вам не нужна промежуточная сущность между Post и Tag.Я сам изо всех сил пытался заставить его работать несколько месяцев назад, но после тщательного прочтения «Многие ко многим, однонаправленный» мне удалось это сделать.

Дело в том, что вы этого не делаетесоздавать отношения Many-To-One и One-To-Many, но один Many-To-Many.

Что касается встроенных форм, как только вы установите Many-To-Many отношение между Post и Tag, вам нужно будет использовать collection тип поля формы.По сути, вы будете говорить: «Хорошо, у меня есть форма с полями Post, которая может иметь много Tags.

Конечно, я бы посоветовал вам попробоватьуправление данными вручную (сохранение, обновление, удаление) перед попыткой заставить их работать с формами. Если у вас есть ошибка в вашей модели, будет намного труднее найти источник проблемы, поскольку сами формы могут быть сложными.

В официальных документах Symfony есть отличная статья об этом, хотя, я должен сказать, это немного ошеломляет начинающего Symfony, поскольку я читал его.

...