Symfony2 从具有 OneToMany 关系的实体中获取数据

Symfony2 fetch data from entity with OneToMany relation

我有两个实体:AdAdPhoto。他们有关系: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];
}