创建一个实体,该实体将被许多其他实体使用(Doctrine 2)

3

输入图像描述 我该如何做到这一点?

我的实体:

产品实体

/**
 * @ORM\Entity
 * @ORM\Table(name="products")
 */
class Product
{

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

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

    /**
     * (??)
     * @var ArrayCollection
     */
    private $images;
}

文章实体

/**
 * @ORM\Entity
 * @ORM\Table(name="articles")
 */
class Article
{

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

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

    /**
     * (??)
     * @var ArrayCollection
     */
    private $images;
}

图像实体

/**
 * @ORM\Entity
 * @ORM\Table(name="images")
 */
class Image
{

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

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

    /**
     * @ORM\Column(type="string", length=1024)
     * @var string
     */
    private $path;
}

我不知道如何创建像图片中那样具有附加字段的链接表。我应该使用哪种关联方式?如何在实体中管理这些关系?

1个回答

1
通常情况下,当您需要使用多对多的方法时,Doctrine会让您通过简单的注解来定义这种行为。
@ORM\ManyToMany(targetEntity="full_qualified_namespace")
@ORM\JoinTable(
      name="game_schemas_players",
      joinColumns={@ORM\JoinColumn(name="this_field_name", referencedColumnName="id")},
      inverseJoinColumns={@ORM\JoinColumn(name="that_field_anem", referencedColumnName="id")}
  )

这将指示Doctrine创建当前实体和目标实体之间的关系。
但这不是您的情况。从您的模型中可以看出,您需要在“中间”实体上添加一些字段。
这里是您可能想要做的:
class Product
{
    [...]

     /**
     * @var ArrayCollection | ProductImage[]
     *
     * @ORM\OneToMany(targetEntity="ProductImage", mappedBy="product")
     */
    private $productImages;
}

class Image
{
    [...]

     /**
     * @var ArrayCollection | ProductImage[]
     *
     * @ORM\OneToMany(targetEntity="ProductImage", mappedBy="image")
     */
    private $productImages;
}

正如您所看到的,无论是产品还是图像,都与一个名为ProductImage的中间实体具有一对多关系。最后一步将是实现这样的实体:

class ProductImage
{
    [...]

     /**
     * @var Image
     *
     * @ORM\ManyToOne(targetEntity="Image", mappedBy="image")
     * @ORM\JoinColumn(name="image_id", referencedColumnName="id")
     */
    private $image;

     /**
     * @var Product
     *
     * @ORM\ManyToOne(targetEntity="Product", mappedBy="product")
     * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
     */
    private $product;

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

}

产品和图片的所有关系都仍然属于ProductImage


作为一个附注,在实体中实现以下方式的添加方法是很常见的做法:
public function __contructor(){
    $this->productImages = new ArrayCollection();
}

/**
 * Add ProductImage
 *
 * @param ProductImage $productImage
 * @return $this
 */
public function addDocument(ProductImage $productImage)
{
    $productImage->addProductImage($productImage);

    $this->documents->add($document);

    return $this;
}

然后你可以使用以下方法来实现:
$product = new Product();

$image = new Image();

$productImage = new ProductImage($product,$image);

$product->addProductImage($productImage);

不要忘记提供通常的setter方法,因为Doctrine需要它们来初始化实体。

希望能对你有所帮助,祝好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接