Doctrine orm 符号/学说:实体的变化

Doctrine orm 符号/学说:实体的变化,doctrine-orm,symfony,Doctrine Orm,Symfony,抱歉说得含糊不清,但我不知道如何描述这个数据库问题。其中一部分是数据库设计问题,另一部分是如何有效地使用ORM和Symfony的Form builder引擎。让我试着解释一下: 我的数据库里有手机的维修资料。每次维修只针对一部手机。然而,有些手机有不同的颜色。虽然有些维修(如更换电池)适用于所有设备,但有些维修(如更换显示器)的价格因设备颜色而异。应该可以在修理菜单中指定每次修理的颜色(选择一种、多种或全部) 我当前的数据库设计如下所示: 但这不允许我从维修实体访问设备的颜色,因为这里的颜色与

抱歉说得含糊不清,但我不知道如何描述这个数据库问题。其中一部分是数据库设计问题,另一部分是如何有效地使用ORM和Symfony的Form builder引擎。让我试着解释一下:

我的数据库里有手机的维修资料。每次维修只针对一部手机。然而,有些手机有不同的颜色。虽然有些维修(如更换电池)适用于所有设备,但有些维修(如更换显示器)的价格因设备颜色而异。应该可以在
修理
菜单中指定每次修理的颜色(选择一种、多种或全部)

我当前的数据库设计如下所示:

但这不允许我从维修实体访问设备的颜色,因为这里的颜色与设备直接相关,而不是维修。因此,我需要一个更复杂的数据库,它仍然将iphone视为单一产品,但可以将各种修复映射到它的许多变体,也可以将通用修复映射到所有变体


我是否应该使用包含3个ID的联接表(修复设备颜色)?看起来不漂亮。用ORM理论来描述这一点最有效的方法是什么?我应该使用数据继承吗?

根据实际修复场景,用户可能会通过更改主体来更改设备的颜色,您可能希望维护额外的3个实体,而不是一个关联
devices\u colous\u repairs

  • 设备属性
    (设备多对一)
  • device\u repair\u属性
    (仅当属性在修复过程中更改时,才使用修复ID进行多对一)
  • 附加的
    repair\u billing
    以根据标准/attrib变更存储账单成本。(多对一,带有带有可选外键的修理ID和
    device\u repair\u attrbutes
    ,如适用)

  • 只是一个规范化数据的建议。

    我想给你一个好的答案,所以我花了一点时间来创建我的答案。这可能并不完美,但它会给你一个想法。顺便说一下,你给出的digram不是ER图

    我在Excel中创建了这个,复制并保存为图片。表名和ORM注释很重要

    例如,您将以标准方式创建一个文件名为“src/AppBundle/Entity/Device.php”的“Device”实体。对于数组,您需要添加到Entity类中的_construct()函数中

    例如,以下是设备实体的代码:

    <?php
    
    // src/AppBundle/Entity/Device.php
    namespace AppBundle\Entity;
    
    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity
     *  @ORM\Table(name="device")
     */
    class Device
    {
        /**
         * @ORM\Id
         * @ORM\Column(name="device_id", type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $device_id;
    
            /**
         * @ORM\Column(name="model", type="string", unique=true)
         */
        protected $model;
    
        /**
         * @ORM\OneToMany(targetEntity="Part", mappedBy="part_device")
         */
        protected $parts = null;
    
    ...
    
        public function __construct(){
            // This is an array of parts.
            $this->parts = new ArrayCollection();
    
            // Create the other arrays too.
            $this->repairs = new ArrayCollection();
            $this->customers = new ArrayCollection();
        }
    
        /*
         * This should automatically be generated by the command.
         * php bin/console doctrine:generate:entities AppBundle/Entity/Device
         */
        public function addPart($part){
            $this->parts[] = $part;
        }
    }
    

    Hi bluppfisk。我建议您熟悉for数据库,然后绘制一个适当的ER图,这样您就可以了解您需要什么。Eclipse(一个流行的IDE)中有一个免费的创建这样一个图表。推给我这将帮助你。你好,阿尔文,谢谢。事实上,我有一个,它由第二个多对多联接表组成,其中设备+颜色与修复配对,但我不知道如何将其映射到Symfony。你能将其发布到某个地方吗?可能使用imgur并将链接添加到你的帖子。我仔细看过你r更新了图表bluppfisk。它可以,但对于您可能(我不确定)需要的东西来说可能太复杂了。例如,您有“设备颜色”,但这可能是一个“零件”,零件的“颜色”可以定义为特定唯一设备的颜色。颜色是否映射到“唯一”型号?此外,您有“repairs\u parts”表,该表也连接到“Part”表;与其进行修复,不如使用类似于我的设计中的零件数组。我的设计更易于使用。因为您只需使用类似于
    $parts=$repair->getParts()的方法
    就这样,所有的部分都在你手上。这也让Twig中的一切变得简单。谢谢!但是不需要更改颜色。我现在想知道的是,我是如何在symfony映射中定义这样一个三重连接表的?第三个实体可以与其他两个实体关联。这样,你就可以将数据规范化并关联起来使用price.so我应该在映射注释中设置两个目标实体?我似乎在网上找不到构成三列联接表的任何代码示例。或者我应该使用表继承或其他方法吗?该死,您刚刚编辑了图表。这看起来比另一个更好。嘿,Alvin,感谢您提供了全面的答案。但是,我遇到的问题这并不是说我无法建立实体之间的关系。更重要的是,我需要一个设备通过其名称和颜色(其本身是多对多的,因为一个设备可能有多种颜色)来识别,以配合正确的维修。我想我现在可能会使用复合钥匙。但仍然不确定如何操作。问题:不同颜色的手机是否有“唯一”的型号?我只是想知道制造商如何用不同的颜色识别它们?我曾在一家制造公司工作(很久以前),有不同的型号来识别。这就是为什么我要问这个问题。它们可能很好,但这需要用户创建各种无关紧要的产品。他应该能够勾选设备的各种颜色,然后将一些维修映射到所有这些颜色,或者只映射到一些颜色。有没有我花在帮助别人上的精力或时间?我想在stackoverflow上不帮助别人那么多。。。