Symfony2原则在findBy函数中传递外键参数

时间:2014-02-19 21:11:08

标签: php symfony doctrine query-builder

我正在尝试加载一个将参数传递给外键的实体,即inverse side

我有这两个实体

广告

/**
 * Ad
 *
 * @ORM\Table(name="Ad")
 * @ORM\Entity(repositoryClass="Symarket\MarketBundle\Repository\AdRepository")
 */
class Ad 
{
     /**
     * @var AdImage
     *
     * @ORM\OneToMany(targetEntity="AdImage", mappedBy="ad", cascade={"persist", "merge"})
     */
     private $images;

     //...
}

AdImage

/**
 * AdImage
 *
 * @ORM\Table(name="AdImage")
 * @ORM\Entity(repositoryClass="Symarket\MarketBundle\Repository\AdImageRepository")
 */
class AdImage {

    /**
     * @var boolean
     *
     * @ORM\Column(name="adi_is_visible", type="boolean")
     */
    protected $isVisible;

    /**
     * @var Ad
     *
     * @ORM\ManyToOne(targetEntity="Ad", inversedBy="images", cascade={"persist"})
     * @ORM\JoinColumn(name="adi_ad_id", referencedColumnName="ad_id")
     */
    protected $ad;
}

现在,通过从数据库中获取Ad,我想获得"isVisibile" => true

的图像

如何使用queryBuilder实现这一点?

到目前为止我用findBy函数尝试的是这个

public function findById($adId) {
    $res = $this->findBy(array("id" => $adId, "isVisible" => true, "images" => array("isVisible" => true)));
    $ad = reset($res);

    return $ad;
}

我收到了这个错误     您无法搜索关联字段'Symarket \ MarketBundle \ Entity \ Ad#images',因为它是关联的反面。查找方法仅适用于拥有副关联。

然后我用querybuilder

尝试了这种方式
public function findById($adId) {
    $res = $query = $this->createQueryBuilder('ad')
            ->leftJoin('ad.images', 'img')
            ->where('img.isVisible = :adVisible')
            ->andWhere('ad.id = :id')
            ->setParameter('adId', $adId)
            ->setParameter('imgVisible', true)
            ->getQuery();

    $ad = reset($res);

    return $ad;
}

我得到NULL

提前致谢。

2 个答案:

答案 0 :(得分:2)

对于那些可能遇到此问题的人来说,这是我的解决方案:

public function findById($adId) {
    $ad = $this->getEntityManager()
            ->createQuery("SELECT a, i from MarketBundle:Ad a LEFT JOIN a.images i with i.isVisible = :visible where a.id = :adId")
            ->setParameter("adId", $adId)
            ->setParameter("visible", true)->getSingleResult();

    return $ad;
}

答案 1 :(得分:1)

您可以使用AdImage实体的默认存储库执行此操作。考虑这个例子:

$entityManager = $this->getEntityManager();
// You said you already have the Ad entity instance you care about so just grabbing by id for demonstration purposes
$ad = $entityManager->getRepository('Ad')->findOneById(5);
$adImagesVisible = $entityManager->getRepository('AdImage')->findBy(array('isVisible' => true, 'ad' => $ad->getId()));

如果您从关系“很多”方面的实体处理此问题,您应该能够获得所需内容,而无需编写自定义DQL查询。