我怎么能这样做?
我的实体:
产品实体
/**
* @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;
}
我不知道如何使用图片等附加字段创建链接表。我应该使用哪种关联?如何在实体中管理这些关系?
答案 0 :(得分: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;
}
正如您在此处所定义的那样,Product和Image与中间实体具有 oneToMany 关系,该实体将命名为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 。
作为实体的旁注,通常的做法是以这种方式实现add方法:
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需要它们来初始化实体。
希望它有所帮助,问候。