Symfony2 从具有 OneToMany 关系的实体中获取数据
Symfony2 fetch data from entity with OneToMany relation
我有两个实体:Ad
和 AdPhoto
。他们有关系:OneToMany(许多 AdPhoto 到一个广告)。
坚持后,我尝试通过方法Ad::getPhoto()
从Ad
获取AdPhoto
,但我得到PersistentCollection
class,我不知道如何处理它。
帮助我了解如何将所有相关的 AdPhoto 获取到广告。
实体广告:
namespace AdBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* Ad
*
* @ORM\Table(name="Ad")
* @ORM\Entity
*/
class Ad
{
...
/**
* @ORM\OneToMany(targetEntity="AdBundle\Entity\AdPhoto", mappedBy="id")
*/
private $photo;
...
}
实体广告图片:
namespace AdBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;
/**
* AdPhoto
*
* @ORM\Table(name="AdPhoto")
* @ORM\Entity
*/
class AdPhoto
{
...
/**
* @ORM\ManyToOne(targetEntity="AdBundle\Entity\Ad", inversedBy="photo")
* @ORM\JoinColumn(name="ad", referencedColumnName="id")
*/
private $ad;
...
}
在控制器中:
$ad = $this->getDoctrine()->getRepository('AdBundle:Ad')
->findOneBy(array(
'id' => $id
));
var_dump($ad->getPhoto());
return $this->render('AdBundle:Default:view.html.twig', array(
'ad' => $ad
));
您可以像循环常规数组一样循环遍历 twig 中的数组集合。如果你想在 php 代码中将它用作数组,你可以使用
$photos = $ad->getPhotos()->toArray();
并且由于 add 可以有很多照片,所以最好使用 $photos 而不是 $photo。
Ivan Toncev 的回答很好,但是为了让事情更容易理解,您可能还想了解一件事。
PersistentCollection
确实有您需要的值。您只是在记录它们时看不到它。不知道为什么。
您可以尝试以下操作来检查是否确实存在数据:
$ad->getPhotos()->count(); // Counts the amount of items (rows).
count($ad->getPhotos()); // Same as above.
// Loop trough all photo's.
for ($i = 0; $i < count($ad->getPhotos()); $i++) {
// A single photo!
$photo = $ad->getPhotos()[$i];
}
我有两个实体:Ad
和 AdPhoto
。他们有关系:OneToMany(许多 AdPhoto 到一个广告)。
坚持后,我尝试通过方法Ad::getPhoto()
从Ad
获取AdPhoto
,但我得到PersistentCollection
class,我不知道如何处理它。
帮助我了解如何将所有相关的 AdPhoto 获取到广告。
实体广告:
namespace AdBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* Ad
*
* @ORM\Table(name="Ad")
* @ORM\Entity
*/
class Ad
{
...
/**
* @ORM\OneToMany(targetEntity="AdBundle\Entity\AdPhoto", mappedBy="id")
*/
private $photo;
...
}
实体广告图片:
namespace AdBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;
/**
* AdPhoto
*
* @ORM\Table(name="AdPhoto")
* @ORM\Entity
*/
class AdPhoto
{
...
/**
* @ORM\ManyToOne(targetEntity="AdBundle\Entity\Ad", inversedBy="photo")
* @ORM\JoinColumn(name="ad", referencedColumnName="id")
*/
private $ad;
...
}
在控制器中:
$ad = $this->getDoctrine()->getRepository('AdBundle:Ad')
->findOneBy(array(
'id' => $id
));
var_dump($ad->getPhoto());
return $this->render('AdBundle:Default:view.html.twig', array(
'ad' => $ad
));
您可以像循环常规数组一样循环遍历 twig 中的数组集合。如果你想在 php 代码中将它用作数组,你可以使用
$photos = $ad->getPhotos()->toArray();
并且由于 add 可以有很多照片,所以最好使用 $photos 而不是 $photo。
Ivan Toncev 的回答很好,但是为了让事情更容易理解,您可能还想了解一件事。
PersistentCollection
确实有您需要的值。您只是在记录它们时看不到它。不知道为什么。
您可以尝试以下操作来检查是否确实存在数据:
$ad->getPhotos()->count(); // Counts the amount of items (rows).
count($ad->getPhotos()); // Same as above.
// Loop trough all photo's.
for ($i = 0; $i < count($ad->getPhotos()); $i++) {
// A single photo!
$photo = $ad->getPhotos()[$i];
}