Symfony / Doctrine:实体的变体

时间:2016-07-27 23:29:55

标签: doctrine-orm symfony

对于模糊性表示抱歉,但我对如何描述此数据库问题感到困惑。部分原因是数据库设计问题,另一部分是如何有效地使用Doctrine ORM和Symfony的表单构建器引擎。让我试着解释一下:

我的数据库包含手机维修。每次维修仅适用于一部手机。但是,有些手机有不同的颜色。虽然某些维修(如电池更换)适用于所有设备,但某些(如显示屏更换)根据设备的颜色有不同的价格。应该可以在- (void)updateBottomLayoutGuides { // this method ends up calling -(id)bottomLayoutGuide on its UIViewController // and thus updating where the Legal link on the map should be. [self.mapView setNeedsLayout]; } 菜单中指定每个修复的颜色(选择一个,多个或全部)。

我目前的数据库设计如下:

like this?

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

我应该使用由3个ID组成的连接表(repair_device_color)吗?看起来不漂亮。使用Doctrine ORM进行映射的最有效方法是什么?我应该使用数据继承吗?

2 个答案:

答案 0 :(得分:0)

根据现实世界的修复方案,可能会通过更改正文来更改设备的颜色,您可能希望维护额外的3个实体而不是一个关联devices_colous_repairs

  1. device_attributes(设备多对一)
  2. device_repair_attrbutes(仅当修复过程中的属性发生更改时,才会修复多个修复ID。
  3. 根据标准/属性更改存储帐单费用的额外repair_billing。 (多对一的修复ID,可选的外键,device_repair_attrbutes适用。
  4. 只是建议规范化数据。

答案 1 :(得分:0)

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

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

Repairs Schema

例如,您将以标准方式创建一个文件名为“src / AppBundle / Entity / Device.php”的“设备”实体。对于数组,您需要在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;
    }
}

希望你能弄明白其余的。但我认为这是一个好的开始。