使用"嵌套"生成Doctrine实体。数组集合

时间:2015-06-12 17:35:18

标签: php arrays symfony doctrine-orm

我正在建立一个计算机配置器,并有四个实体。

  1. 客户(不相关)
  2. 计算机(ID,客户,序列号,日期,[组件])
  3. ArticleGroup(id,name)
  4. 文章(id,name,price,articleGroup,active)
  5. Computer实体的属性[components]应包含如下数组:

        $components = array(
      'CPU' => array(
        'name' => 'Intel Core i7',
        'count' => 1,
        'price' => 275),
      'Mainboard' => array(
        'name' => 'Gigabyte H97-D3H',
        'count' => 1,
        'price' => 75),
      'RAM' => array(
        'name' => '4GB DDRIII Kingston Value Ram',
        'count' => 4,
        'price' => 28),
      'SSD' => array(
        'name' => '512GB Samsung 850 Pro',
        'count' => 1,
        'price' => 400)
      );
    

    数组密钥价格可能与商品实体的价格不同。(由于硬件的每日价格或因为我认为该客户以较少的钱获得cpu)

    现在问题我不知道如何创建这个组件数组。

    这是我的电脑实体:

        <?php
    
    namespace ctcrm\ConfiguratorBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Validator\Constraints as Assert;
    
    /**
     * Computer
     *
     * @ORM\Table()
     * @ORM\Entity
     */
    class Computer
    {
      /**
       * @var integer
       *
       * @ORM\Column(name="id", type="integer")
       * @ORM\Id
       * @ORM\GeneratedValue(strategy="AUTO")
       */
      private $id;
    
      /**
       * @var string
       * @Assert\NotBlank()
       * @Assert\Length(
       *      min = 12,
       *      max = 12,
       *      minMessage = "no valid serial!",
       *      maxMessage = "no valid serial!"
       * )
       * @ORM\Column(name="serial", type="string", length=12)
       */
      private $serial;
    
      /**
       * @var \DateTime
       * @Assert\NotBlank()
       * @ORM\Column(name="date", type="date")
       */
      private $date;
    
      /**
       * @ORM\ManyToOne(targetEntity="Customer")
       * @ORM\JoinColumn(name="customer_id", referencedColumnName="id")
       * @Assert\NotBlank()
       **/
      private $customer;
    
      /**
       * Get id
       *
       * @return integer
       */
      public function getId()
      {
        return $this->id;
      }
    
      /**
       * Set serial
       *
       * @param string $serial
       * @return Computer
       */
      public function setSerial($serial)
      {
        $this->serial = $serial;
    
        return $this;
      }
    
      /**
       * Get serial
       *
       * @return string
       */
      public function getSerial()
      {
        return $this->serial;
      }
    
      /**
       * Set date
       *
       * @param \DateTime $date
       * @return Computer
       */
      public function setDate($date)
      {
        $this->date = $date;
    
        return $this;
      }
    
      /**
       * Get date
       *
       * @return \DateTime
       */
      public function getDate()
      {
        return $this->date;
      }
    
      /**
       * @return mixed
       */
      public function getCustomer()
      {
        return $this->customer;
      }
    
      /**
       * @param mixed $customer
       */
      public function setCustomer($customer)
      {
        $this->customer = $customer;
      }
    
    
    }
    

1 个答案:

答案 0 :(得分:3)

没有(可靠的)在SQL表中拥有数组的方法。您需要对数据执行序列化,如果可以避免,则不建议这样做。

您可能想要做的是使用Join表创建一个与计算机有多对多关系的Component Entity。

请参阅Doctrine文档:http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#many-to-many-unidirectional

您将希望方向性从“计算机”到“组件”,因为计算机包含许多组件,但不包含反向组件。多对一关系需要重复的组件条目(引用物理对象而不是使用型号的分类),而多对多关系允许您填充组件列表,并在计算机中引用它们。