0

私はsymfony/Doctrineにかなり慣れておらず、querybuilderでいくつか問題があります:

このERを考えると:

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

しかし、それは機能しません。多対1の外部キーが存在する場合にデータをフィルタリングする正しい方法は何ですか?モデルにgsite_id列の宣言を作成する必要がありますか?

ありがとう。

4

1 に答える 1

2

パラメータを設定すると、Doctrineはタイプを推測できるようになります(外部キーを使用する必要はありませんid)。

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