带有额外字段的教义关系 MtM

Posted

技术标签:

【中文标题】带有额外字段的教义关系 MtM【英文标题】:Doctrine relation MtM with extra fields 【发布时间】:2016-03-10 13:08:44 【问题描述】:

我有三个班级:

    产品 组件 产品组件

我想用额外的字段(组件的数量)创建多对多的关系,产品是由组件构建的,所以我创建了三个类,例如:

产品:

/**
 * Product
 *
 * @ORM\Table(name="product")
 * @ORM\Entity(repositoryClass="Justart\ProductsBundle\Repository\ProductRepository")
 *
 * @GRID\Source(columns="id,name,code,category.name,active")
 */
class Product

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     *
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     *
     */
    private $name;

    /**
     * @var array
     * @ORM\OneToMany(targetEntity="ProductComponent", mappedBy="product")
     *
     */
    private $components;

组件:

/**
 * Component
 *
 * @ORM\Table(name="component")
 * @ORM\Entity(repositoryClass="Justart\ProductsBundle\Repository\ComponentRepository")
 *
 */

class Component

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     *
     * @GRID\Column(title="ID", type="number")
     */
    private $id;

    /**
     * @var string
     *
     * @Assert\NotBlank()
     * @ORM\Column(name="name", type="string", length=255)
     *
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="ProductComponent", mappedBy="component")
     */
    private $componentProducts;

产品组件:

/**
 * ProductComponent
 *
 * @ORM\Table(name="product_component")
 * @ORM\Entity(repositoryClass="Justart\ProductsBundle\Repository\ProductComponentRepository")
 */
class ProductComponent

    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="product_component")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=false)
     */
    private $product;

    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Component", inversedBy="product_component")
     * @ORM\JoinColumn(name="component_id", referencedColumnName="id", nullable=false)
     */
    private $component;

    /**
     * @var int
     *
     * @ORM\Column(name="quantity", type="integer")
     */
    private $quantity;

    /**
     * @var string
     *
     * @ORM\Column(name="unit", type="string")
     */
    private $unit;

我得到类似this 的架构:

但是如果我得到 Product 并使用方法 getComponents 我得到空数组(),另外我得到两个学说错误:

第一:

  ...\Entity\Product    
    The mappings ...\Entity\Product#components and ...\Entity\ProductComponent#product are inconsistent with each other.

第二:

...\Entity\ProductComponent 
The association ...\Entity\ProductComponent#product refers to the inverse side field ...\Entity\Product#product_component which does not exist.
The association ...\Entity\ProductComponent#component refers to the inverse side field ...\Entity\Component#product_component which does not exist.

我做错了什么?

所以我更改了属性名称以匹配映射并且我没有错误但我仍然没有产品对象中的组件

public function testAction(Request $request, Product $product = null)
       return $this->render(
            'ProductsBundle:Product:add.html.twig', array(
                'product' => $product,
            )
        );
    

当我在视图中倾倒产品时,我的 col1: elements[] 集合为空

Product #439 ▼
  -id: 1
  -name: "test"
  -code: "rerer"
  -category: ProductCategory #446 ▶
  -product_component: PersistentCollection #462 ▼
    -snapshot: []
    -owner: Product #439
    -association: array:15 [ …15]
    -em: EntityManager #91 …10
    -backRefFieldName: "product"
    -typeClass: ClassMetadata #444 …
    -isDirty: false
    -initialized: false
    -coll: ArrayCollection #463 ▼
      -elements: []
    
  
  -active: true

【问题讨论】:

Doctrine2: Best way to handle many-to-many with extra columns in reference table的可能重复 【参考方案1】:

查看The docs on associations 了解更多信息。 在您的情况下,您的引用无效:

class ProductComponent

    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="components")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=false)
     */
    private $product;

    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Component", inversedBy="componentProducts")
     * @ORM\JoinColumn(name="component_id", referencedColumnName="id", nullable=false)
     */
    private $component;

Doctrine 正在寻找 Product::$product_component 属性,该属性不存在。

【讨论】:

所以我必须创建私有 $product_component 我应该添加什么注释? 不,只需像我在示例中所做的那样编辑您的 ProductComponent 反转。 (也许阅读文档:3) 好的,但是我应该怎么做才能进入产品对象,与产品相关的组件?

以上是关于带有额外字段的教义关系 MtM的主要内容,如果未能解决你的问题,请参考以下文章

带有额外字段的 Django ManyToMany 字段不会显示在两个关系上

我如何使用教义来创建独特的关系?

优雅的规范化,无需添加字段,额外的表格。最好的关系

Android Room - 带有附加字段的多对多关系

在 aws appsync 解析器中添加额外字段

带有教义的查询构建器中的外部联接