为了账号安全,请及时绑定邮箱和手机立即绑定

用于多个相同结构的表集的通用/通配符实体类

用于多个相同结构的表集的通用/通配符实体类

PHP
慕斯王 2021-11-05 15:43:55
我正在重写一个大型 SaaS 电子商务项目的某些部分,该项目已经构建和扩展了多年。主要部分是分开的,所以我有一个后端、一个商店前端和一个常规登录页面。因此,我可以重写不同的部分,但不能更改数据库。它有很多混合的意大利面条式程序代码,没有分离的函数文件等,以及或多或少的糟糕的 DB 设计。首先,我将重写商店前端。基础是由超薄框架 v3 和 Doctrine ORM 以 OOP 方式构建的。为了构建实体,我对现有的数据库架构有问题。每个现有商店都有自己的一组表格(最小 3x,最大 5x),其中包含订单信息 ( $client_order, $client2_order, ...)、购物车信息 ( $client_info, $client2_info, ...) 和其他所需的附加信息。我不想拥有 $total_shop*3 实体文件的数量,其中包含 100% 相同的代码。因此,我考虑使用包含每个表属性的抽象/通用 Shop-Entities 之类的东西。这样我可能会$client事先获得,加载实体并更改相应的表。这可能吗,我将如何构建和使用这些实体?只是为了描绘它,我的意思是,一些伪代码:// 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\PseudoControllerpublic function myMethod() {  $db_name = "client1"; // gotten beforehand  $Orders = $this->container->get(GenericShopOrderRepository::class)->#####setTable($db_name)#####->findAll();}
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

我找到了一个解决方案:


去除Entity的table注解

在控制器中使用以下代码段:

    $meta = $em->getClassMetadata('App\Entity\GenericShopOrder');

    $meta->setTableName($var."_info");

    $repo = $em->getRepository('App\Entity\GenericShopOrder');

通过使用 getClassMetadata 实体被加载,额外的 setTableName 分配相应的表名。之后,回购/实体正常工作 - 在代码执行时分配了一个表。


查看完整回答
反对 回复 2021-11-05
  • 1 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信