Generic/wildcard 多个相同结构化表集的实体 class
Generic/wildcard Entity class for multiple indentical structured set of tables
我正在重写一个构建和扩展多年的大型 SaaS 电子商务项目的某些部分。主要部分是分开的,所以我有一个后端、一个商店前端和一个常规登录页面。因此我可以重写不同的部分但不能改变数据库。这是很多混合的意大利面条式程序代码,没有单独的函数文件等,并且或多或少是糟糕的数据库设计。
首先,我将重写商店前端。该基础由 slim framework v3 和 Doctrine ORM 以面向对象的方式构建。
为了构建实体,我遇到了现有数据库模式的问题。每个现有商店都有自己的一组 tables(最小 3x,最大 5x)保存订单信息($client_order
、$client2_order
、...)、购物车信息($client_info
, $client2_info
, ...), 以及其他需要的额外费用。我不想拥有 $total_shop*3 个实体文件,其中包含 100% 相同的代码。
所以我想拥有类似 abstracted/generic Shop-Entities 的东西,其中包含每个 table 的属性。这样我可能会事先得到 $client
,加载实体并更改相应的 table.
这可能吗,我将如何构建和使用这些实体?
只是为了描绘它,我的意思是,一些伪代码:
// App\Entity\GenericShopOrder
/**
* @ORM\Entity(repositoryClass="App\Repository\GenericShopOrderRepository")
* @ORM\Table(name="###PROBLEMATIC###") <-----
*/
class GenericShopOrder
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
protected $id = 0;
/**
* @ORM\Column(type="string", length=200)
*/
protected $myString = '';
// ---------
// App\Controller\PseudoController
public function myMethod() {
$db_name = "client1"; // gotten beforehand
$Orders = $this->container->get(GenericShopOrderRepository::class)->#####setTable($db_name)#####->findAll();
}
我找到了解决方案:
- 删除实体的 table 注释
- 在控制器中使用以下代码片段:
$meta = $em->getClassMetadata('App\Entity\GenericShopOrder');
$meta->setTableName($var."_info");
$repo = $em->getRepository('App\Entity\GenericShopOrder');
通过使用 getClassMetadata 加载实体,附加的 setTableName 分配相应的 table 名称。 Repo/Entity 之后正常工作 - 在代码执行时分配 table。
我正在重写一个构建和扩展多年的大型 SaaS 电子商务项目的某些部分。主要部分是分开的,所以我有一个后端、一个商店前端和一个常规登录页面。因此我可以重写不同的部分但不能改变数据库。这是很多混合的意大利面条式程序代码,没有单独的函数文件等,并且或多或少是糟糕的数据库设计。
首先,我将重写商店前端。该基础由 slim framework v3 和 Doctrine ORM 以面向对象的方式构建。
为了构建实体,我遇到了现有数据库模式的问题。每个现有商店都有自己的一组 tables(最小 3x,最大 5x)保存订单信息($client_order
、$client2_order
、...)、购物车信息($client_info
, $client2_info
, ...), 以及其他需要的额外费用。我不想拥有 $total_shop*3 个实体文件,其中包含 100% 相同的代码。
所以我想拥有类似 abstracted/generic Shop-Entities 的东西,其中包含每个 table 的属性。这样我可能会事先得到 $client
,加载实体并更改相应的 table.
这可能吗,我将如何构建和使用这些实体?
只是为了描绘它,我的意思是,一些伪代码:
// App\Entity\GenericShopOrder
/**
* @ORM\Entity(repositoryClass="App\Repository\GenericShopOrderRepository")
* @ORM\Table(name="###PROBLEMATIC###") <-----
*/
class GenericShopOrder
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
protected $id = 0;
/**
* @ORM\Column(type="string", length=200)
*/
protected $myString = '';
// ---------
// App\Controller\PseudoController
public function myMethod() {
$db_name = "client1"; // gotten beforehand
$Orders = $this->container->get(GenericShopOrderRepository::class)->#####setTable($db_name)#####->findAll();
}
我找到了解决方案:
- 删除实体的 table 注释
- 在控制器中使用以下代码片段:
$meta = $em->getClassMetadata('App\Entity\GenericShopOrder');
$meta->setTableName($var."_info");
$repo = $em->getRepository('App\Entity\GenericShopOrder');
通过使用 getClassMetadata 加载实体,附加的 setTableName 分配相应的 table 名称。 Repo/Entity 之后正常工作 - 在代码执行时分配 table。