0

我对 symfony/Doctrine 很陌生,并且在查询构建器方面遇到了一些问题:

鉴于此 ER:

急诊室

以及以下声明:

namespace xxx\SeoBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * xxx\SeoBundle\Entity\Session
 *
 * @ORM\Table(name="session")
 * @ORM\Entity
 */
class Session
{
    const repositoryName = "InternetSmSeoBundle:Session";

    /**
     * @var string $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     */
    private $id;
......
    /**
     * @var Gsite
     *
     * @ORM\ManyToOne(targetEntity="Gsite")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="gsite_id", referencedColumnName="id")
     * })
     */
    private $site;
......
}

我需要找到按站点过滤它们的会话。我尝试了以下方法:

    $rep = $this->em->getRepository(Session::repositoryName);
    $qb = $rep->createQueryBuilder("s");

    $qb->setMaxResults(200);
    $qb->where("1=1");
    $qb->orderBy("time", "desc");

    //site
    if ($params->site != null){
        /** @var Gsite **/
        $site = $params->site;
        $qb->where($qb->expr()->eq("gsite_id",$site->getId()));
    }

甚至

    $qb->where($qb->expr()->eq("site",$site));

但它不起作用。在存在多对一外键的情况下过滤数据的正确方法是什么?我需要在我的模型中创建 gsite_id 列的声明吗?

谢谢。

4

1 回答 1

2

设置参数,Doctrine 就能推断出类型(无需使用外键id):

$qb
    ->where($qb->expr()->eq('site', ':site'))
    ->setParameter('site', $site);
;
于 2012-11-30T10:21:27.523 回答