我有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;
}