2016-01-26 2 views
1

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

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

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 (внешний ключ).

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

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

ответ

0

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

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

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

Смежные вопросы