Расширение базы данных магазинов, создание отношений
Я пытаюсь реализовать плагин, чтобы добавить данные торгового представителя в мой магазин и связать эти данные с пользователями.
В этом контексте (пользователи и торговый представитель) у меня есть:
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 ответ
Пока нет способа создать двунаправленные ассоциации с основными таблицами магазинов. У вас наверняка могут быть однонаправленные ассоциации, но вы пока не сможете добавлять реляционные свойства в основные сущности.
За исключением того, что вы намереваетесь изменить само ядро магазина, чего следует избегать в любое время.
Единственная - и очень крошечная - возможность была бы при попытке создать связь по таблице атрибутов основных сущностей, которая является довольно "волшебной вещью" в магазине.