Расширение базы данных магазинов, создание отношений

Я пытаюсь реализовать плагин, чтобы добавить данные торгового представителя в мой магазин и связать эти данные с пользователями.

В этом контексте (пользователи и торговый представитель) у меня есть:

sales_rep - Таблица торговых представителейsales_rep_user - Отношения между пользователем и торговым представителем

1-й для swg_sales_rep а также swg_sales_rep_user отношение (OneToMany) я мог бы создать это без проблем

SwgSalesRepresentative.php

...
**
 * @ORM\Entity
 * @ORM\Table(name="swg_sales_rep")
 */
class SwgSalesRepresentative extends ModelEntity
{
    ...
/**
     * INVERSE SIDE
     *
     * @var \Doctrine\Common\Collections\ArrayCollection
     *
     * @ORM\OneToMany(
     *      targetEntity="Shopware\CustomModels\SwagUserSalesRepresentative\SwgSalesRepresentative",
     *      mappedBy="salesRepresentative",
     *      orphanRemoval=true
     * )
     */
    protected $salesRepresentativeUsers;

...

SwgSalesRepresentativeUsers.php

/**
 * @ORM\Entity
 * @ORM\Table(name="swg_sales_rep_users")
 */
class SwgSalesRepresentativeUsers extends ModelEntity
{

...

/**
     *
     * @ORM\ManyToOne(targetEntity="Shopware\CustomModels\SwagUserSalesRepresentative\SwgSalesRepresentative")
     * @ORM\JoinColumn(name="sales_rep_id", referencedColumnName="id")
     */
    protected $salesRepresentative;

/**
     * @return mixed
     */
    public function getSalesRepresentative()
    {
        return $this->salesRepresentative;
    }

    /**
     * @param $salesRepresentative
     * @return ModelEntity
     */
    public function setSalesRepresentative($salesRepresentative)
    {
        return $this->setManyToOne(
            $salesRepresentative,
            '\Shopware\CustomModels\SwagUserSalesRepresentative\SwgSalesRepresentative',
            'salesRepresentativeUsers'
        );
    }

И после установки я получаю свои таблицы с внешним ключом в порядке.

Для связи между swg_sales_rep_user а также s_user (OneToOne) У меня проблемы. Моей первой идеей было продлить User смоделируйте и добавьте дополнительную логику, которая нам нужна. Но это подразумевает перезапись моей таблицы пользователей, рискуя потерять данные. То, что я сделал, было создать SwgUser модель, которая расширяет модель пользователя, как

SwgSalesRepresentativeUsers.php

/**
 * @ORM\Entity
 * @ORM\Table(name="swg_sales_rep_users")
 */
class SwgSalesRepresentativeUsers extends ModelEntity
{

...

    /**
     * @var \Shopware\CustomModels\SwagUserSalesRepresentative\SwgUser $user
     *
     * @ORM\OneToOne(targetEntity="Shopware\CustomModels\SwagUserSalesRepresentative\SwgUser", inversedBy="salesRepresentative")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

 /**
     * @return mixed
     */
    public function getUser()
    {
        return $this->user;
    }

    /**
     * @param $user
     * @return ModelEntity
     */
    public function setUser($user)
    {
        return $this->setOneToOne(
            $user,
            '\Shopware\CustomModels\SwagUserSalesRepresentative\SwgUser',
            'user',
            'salesRepresentative'
        );
    }

...

SwgUser.php

/**
 * @ORM\Entity
 * @ORM\Table(name="s_user")
 */
class SwgUser extends User
{

    /**
     *
     * @ORM\OneToOne(targetEntity="Shopware\CustomModels\SwagUserSalesRepresentative\SwgSalesRepresentativeUsers", mappedBy="user")
     */
    protected $salesRepresentative;
 ...

А также bootstrap.php установить / удалить выглядит

 /**
     * Install method
     *
     * @return bool
     */
    public function install()
    {
        $this->updateSchema();

        return true;
    }

    /**
     * Uninstall method
     *
     * @return bool
     */
    public function uninstall()
    {
        $this->registerCustomModels();

        $em = $this->Application()->Models();
        $tool = new \Doctrine\ORM\Tools\SchemaTool($em);

        $classes = array(
            $em->getClassMetadata('Shopware\CustomModels\SwagUserSalesRepresentative\SwgSalesRepresentative'),
            $em->getClassMetadata('Shopware\CustomModels\SwagUserSalesRepresentative\SwgUser'),
            $em->getClassMetadata('Shopware\CustomModels\SwagUserSalesRepresentative\SwgSalesRepresentativeUsers')
        );

        $tool->dropSchema($classes);

        return true;
    }


    /**
     * Creates the database scheme from existing doctrine models.
     *
     * Will remove the table first, so handle with care.
     */
    protected function updateSchema()
    {
        $this->registerCustomModels();

        $em = $this->Application()->Models();
        $tool = new \Doctrine\ORM\Tools\SchemaTool($em);

        $classes = array(
            $em->getClassMetadata('Shopware\CustomModels\SwagUserSalesRepresentative\SwgSalesRepresentative'),
            $em->getClassMetadata('Shopware\CustomModels\SwagUserSalesRepresentative\SwgUser'),
            $em->getClassMetadata('Shopware\CustomModels\SwagUserSalesRepresentative\SwgSalesRepresentativeUsers')
        );

        try {
            $tool->dropSchema($classes);
        } catch (Exception $e) {
            //ignore
        }
        $tool->createSchema($classes);
    }

Я попытался использовать однонаправленное сопоставление ассоциации, и оно создает поле, но не связь с s_user таблица (внешний ключ).

Итак, вопрос в том, как я могу создавать отношения с основными таблицами в магазине без необходимости воссоздания (удаления / создания) основных таблиц? Можно ли программно изменять таблицы? что является лучшим подходом для этих нужд. У вас есть пример, который демонстрирует это?

Спасибо за помощь.

1 ответ

Пока нет способа создать двунаправленные ассоциации с основными таблицами магазинов. У вас наверняка могут быть однонаправленные ассоциации, но вы пока не сможете добавлять реляционные свойства в основные сущности.

За исключением того, что вы намереваетесь изменить само ядро ​​магазина, чего следует избегать в любое время.

Единственная - и очень крошечная - возможность была бы при попытке создать связь по таблице атрибутов основных сущностей, которая является довольно "волшебной вещью" в магазине.

Другие вопросы по тегам