扩展商店数据库,创建关系

时间:2016-01-26 11:33:14

标签: plugins doctrine shopware

我正在尝试实施一个插件,将销售代表数据添加到我的商店,并将这些数据与用户相关联。

在此背景下(用户和销售代表)我有:

sales_rep - 销售代表表 sales_rep_user - 用户和销售代表之间的关系

1对于swg_sales_repswg_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_users_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表(外键)的关系。

所以问题是,如何在不必重新创建(删除/创建)核心表的情况下在shopware上创建与核心表的关系? 是否可以通过编程方式更改表格?什么是满足这些需求的最佳方法。你有一个证明这一点的例子吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

目前还没有办法与商品核心表建立双向关联。您可以确定具有单向关联,但到目前为止,您将无法向核心实体添加关系属性。

除非您打算修改商品核心本身,否则应随时避免。

唯一 - 也是非常微小 - 的可能性是尝试在核心实体属性表上创建一个关系,这是一个非常“神奇的东西”#34;在商店里。