Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2在findBy函数的外键上传递参数_Php_Symfony_Doctrine_Query Builder - Fatal编程技术网

Php Symfony2在findBy函数的外键上传递参数

Php Symfony2在findBy函数的外键上传递参数,php,symfony,doctrine,query-builder,Php,Symfony,Doctrine,Query Builder,我正在尝试加载一个实体,该实体将一个参数传递给一个外键,外键是的反方向 我有两个实体 广告 A图像 /** * AdImage * * @ORM\Table(name="AdImage") * @ORM\Entity(repositoryClass="Symarket\MarketBundle\Repository\AdImageRepository") */ class AdImage { /** * @var boolean * * @ORM

我正在尝试加载一个实体,该实体将一个参数传递给一个外键,外键是
的反方向

我有两个实体

广告

A图像

/**
 * 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”,因为它是关联的反面。Find方法仅对拥有方关联有效

然后我用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


提前感谢。

您可以使用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查询。

您可以使用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查询。

您可以使用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查询。

您可以使用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查询。

对于可能遇到此问题的人,我的解决方案如下:

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

对于可能遇到此问题的人,我的解决方案如下:

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

对于可能遇到此问题的人,我的解决方案如下:

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

对于可能遇到此问题的人,我的解决方案如下:

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


您可以用queryBuilder发布您尝试的查询吗?已编辑,询问您是否需要更多信息我不确定您为什么要对查询结果使用
reset()
。如果想要单一结果,应尝试
getSingleResult()
getOneOrNullResult()
。如果在生成多个结果的查询中只需要第一个结果,则应使用
getResult()
并处理仅在控制器中使用第一个结果的逻辑。请参阅nice,谢谢您的建议,但这不是主要问题:)如果您不遵循记录中的方法使用queryBuilder,我无法帮助您解决该问题。您可以使用queryBuilder发布您尝试的查询吗?编辑,询问您是否还需要其他信息我不确定为什么要对查询结果使用
reset()
。如果想要单一结果,应尝试
getSingleResult()
getOneOrNullResult()
。如果在生成多个结果的查询中只需要第一个结果,则应使用
getResult()
并处理仅在控制器中使用第一个结果的逻辑。请参阅nice,谢谢您的建议,但这不是主要问题:)如果您不遵循记录中的方法使用queryBuilder,我无法帮助您解决该问题。您可以使用queryBuilder发布您尝试的查询吗?编辑,询问您是否还需要其他信息我不确定为什么要对查询结果使用
reset()
。如果想要单一结果,应尝试
getSingleResult()
getOneOrNullResult()
。如果在生成多个结果的查询中只需要第一个结果,则应使用
getResult()
并处理仅在控制器中使用第一个结果的逻辑。请参阅nice,谢谢您的建议,但这不是主要问题:)如果您不遵循记录中的方法使用queryBuilder,我无法帮助您解决该问题。您可以使用queryBuilder发布您尝试的查询吗?编辑,询问您是否还需要其他信息我不确定为什么要对查询结果使用
reset()
。如果想要单一结果,应尝试
getSingleResult()
getOneOrNullResult()
。如果在生成多个结果的查询中只需要第一个结果,则应使用
getResult()
并处理仅在控制器中使用第一个结果的逻辑。请参阅nice,谢谢您的建议,但这不是主要问题:)如果您不遵循记录在案的方法使用queryBuilder,我就无法帮助您使用该方法。