Symfony Doctrine从多对一/一对多关系中自动加载



我有2个主要实体和一个关系表在我的Symfony/Doctrine应用程序。我的目标是轻松加载它们。

我有一个Gallery类,看起来像这样:

class Gallery
{
/**
* @var int
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer", options={"unsigned"=true})
*/
private $id;
/**
* @var string
* @ORMColumn(type="string", length=100, nullable=false)
*/
private $title;
/**
* @var Collection
* @ORMOneToMany(targetEntity=GalleryHasImage::class, mappedBy="gallery")
*/
private $hasImages;**strong text**

图片类:

class Image implements ImageInterface
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer", options={"unsigned"=true})
*/
private $id;
/**
* @ORMColumn(type="string", length=255, nullable=false)
*/
private $title;

和包含额外数据的关系表:

class GalleryHasImage
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer", options={"unsigned"=true})
*/
private $id;
/**
* @var Gallery
* @ORMManyToOne(targetEntity="AppEntityGalleryGallery", inversedBy="hasImages")
*/
private $gallery;
/**
* @var Image
* @ORMManyToOne(targetEntity="AppEntityImageImage", inversedBy="hasGalleries")
*/
private $image;
/**
* @ORMColumn(type="timestamp", options={"unsigned"=true})
*/
private DateTimeInterface $createdAt;
/**
* @ORMManyToOne(targetEntity=User::class)
* @ORMJoinColumn(nullable=false)
*/
private $createdBy;
/**
* @ORMColumn(type="integer", options={"unsigned"=true})
*/
private int $position;

我的目标是有简单的getter在我的画廊类获得图像没有位置。就像

/**
* @Route("/gallery/{id}/images", methods={"GET"}, requirements={"id":"d+"})
* @param Gallery $gallery)
* @return Response
*/
public function getImages(Gallery $gallery)
{
print_r($gallery->getImages());
}

现在我只能做一些额外的步骤,比如:

/**
* @Route("/gallery/{id}/images", methods={"GET"}, requirements={"id":"d+"})
* @param Gallery $gallery)
* @return Response
*/
public function getImages(Gallery $gallery)
{
foreach($gallery->getHasImages as $hasImage)
{ 
print_r($hasImage->getImage());
}
}

您可以通过将hasImages元素映射到控制器或图库实体的getter中的getImage()返回对象来实现

画廊实体
class Gallery
{
/** ... */

public function getImages(): Collection
{
return array_map(function ($hasImages) {
return $hasImages->getImage();
},$this->getHasImages());
}
}

,然后你可以这样写:

/**
* @Route("/gallery/{id}/images", methods={"GET"}, requirements={"id":"d+"})
* @param Gallery $gallery)
* @return Response
*/
public function getImages(Gallery $gallery)
{
print_r($gallery->getImages());
}

一种方法是循环遍历hasImages集合并在每次填充数组时调用getImage(),然后返回数组。

那么,在Gallery中你可以有这样一个方法:

public function getImages(){
$images = [];
foreach($this->hasImages as $hasImage){
$images[] = $hasImage->getImage();
}
return $images;
}

最新更新