Я пытаюсь реализовать плагин для добавления данных о торговых представителях в мой магазин и связывать эти данные с пользователями.Расширение базы данных магазина, создание связей
В этом контексте (пользователи и торговый представитель) у меня есть:
sales_rep
- Торговый представитель таблица sales_rep_user
- Связь между пользователем и торговым представителем
первой Для 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);
}
Я попытался использовать сопоставление ассоциации unidirectional и создает поле, но не отношение с таблицей s_user
(внешний ключ).
Вопрос в том, как я могу создавать отношения с основными таблицами в витрине без необходимости воссоздавать (отбрасывать/создавать) основные таблицы? Можно ли программным образом изменять таблицы? каков наилучший подход для этих потребностей. У вас есть пример, демонстрирующий это?
Спасибо за помощь.