我正在尝试加载一个将参数传递给外键的实体,即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
提前致谢。
答案 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查询。