vyshkant
@vyshkant
developer

Как администрировать Doctrine ORM Class Table Inheritance через SonataAdminBundle (Symfony)?

Добрый день!

У меня есть Doctrine-сущность Foo, которая связана One-To-One с сущностью AbstractBar:

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

    /**
     * @var AbstractBar
     *
     * @ORM\OneToOne(targetEntity="AbstractBar", cascade={"persist"})
     * @ORM\JoinColumn(name="bar_id", referencedColumnName="id")
     */
    private $bar;
}


Сущность AbstractBar - это абстрактная сущность, с которой связаны две конкретные сущности по модели Class Table Inheritance.

Таким образом, у меня есть вот что:
/**
 * @ORM\Table(name="bar")
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="bar_type", type="string")
 * @ORM\DiscriminatorMap({"one" = "BarOne", "two" = "BarTwo"})
 */
abstract class AbstractBar
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
}

/**
 * @ORM\Table(name="bar_one")
 * @ORM\Entity
 */
class BarOne extends AbstractBar
{
    // свойства класса BarOne
}

/**
 * @ORM\Table(name="bar_two")
 * @ORM\Entity
 */
class BarTwo extends AbstractBar
{
    // свойства класса BarTwo
}


При этом админка (SonataAdminBundle) сущности Foo сконфигурирована следующим образом:
class FooAdmin extends AbstractAdmin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('bar', AdminType::class, array(), array(
                'admin_code' => 'key.of.bar_one.admin.service'
            ))
        ;
    }
}


При этом сам сервис администраторского класса выглядит следующим образом:
key.of.bar_one.admin.service:
        class: MyBundle\Admin\BarAdmin
        arguments: [~, MyBundle\Entity\BarOne, ~]
        tags:
            - name: sonata.admin
              manager_type: orm
              show_in_dashboard: false


Приведенный выше код позволяет мне редактировать и создавать сущности BarOne, редактируя сущность Foo.

Вопрос: как мне сделать так, чтобы я мог в админке переключать между BarOne и BarTwo? Т.е. чтобы можно было реализовать тот множественный выбор, который предоставляется Doctrine ORM (Class Table Inheritance).
  • Вопрос задан
  • 1606 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы