営業担当者のデータをショップに追加し、このデータをユーザーに関連付けるプラグインを実装しようとしています。
このコンテキスト (ユーザーと営業担当者) については、次のとおりです。
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
テーブル (外部キー)との関係は作成されません。
質問は、コア テーブルを再作成 (ドロップ/作成) することなく、ショップウェアのコア テーブルとの関係を作成するにはどうすればよいかということです。プログラムでテーブルを変更することは可能ですか? これらのニーズに最適なアプローチは何ですか。これを示す例はありますか?
助けてくれてありがとう。