2

営業担当者のデータをショップに追加し、このデータをユーザーに関連付けるプラグインを実装しようとしています。

このコンテキスト (ユーザーと営業担当者) については、次のとおりです。

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_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);
    }

一方向の関連付けマッピングを使用しようとしましたが、フィールドは作成されますが、s_userテーブル (外部キー)との関係は作成されません。

質問は、コア テーブルを再作成 (ドロップ/作成) することなく、ショップウェアのコア テーブルとの関係を作成するにはどうすればよいかということです。プログラムでテーブルを変更することは可能ですか? これらのニーズに最適なアプローチは何ですか。これを示す例はありますか?

助けてくれてありがとう。

4

1 に答える 1