QueryBuilder上的一个非对象

时间:2014-02-12 09:42:37

标签: symfony doctrine translation

我想创建一个多语言网站,为此我将Symfony与PrezentBundleA2lixBundle一起使用。我会通过实体仓库获取我的数据列表。

我有这个错误:

FatalErrorException: Error: __clone method called on non-object in /project/vendor/doctrine/orm/lib/Doctrine/ORM/QueryBuilder.php line 238

这是我的回购:

$qb = $this->createQueryBuilder('c')
        ->leftJoin('c.criteres', 'crit')
        ->leftjoin('c.translations', 'ct', 'WITH', 'ct.locale = :locale')
        ->setParameters('locale', 'fr');
var_dump($qb->getDql() );

return $qb->getQuery()
        ->getResult();

var_dump告诉我:

SELECT c FROM NS\MyBundle\Entity\CritereCateg c LEFT JOIN c.criteres crit LEFT JOIN c.translations ct WITH ct.locale = :locale

1 个答案:

答案 0 :(得分:4)

您的问题可能是因为误用了setParameters() mehtod。 doctrine查询构建器有两种类似的方法:

1)setParameter()每个方法使用只设置一个参数。语法是:

// for numeric parameters
$qb->leftjoin('c.translations', 'ct', 'WITH', 'ct.locale = ?1')
   ->setParameter(1, 'fr');

// for string parameters
$qb->leftjoin('c.translations', 'ct', 'WITH', 'ct.locale = :locale')
   ->setParameter('locale', 'fr');

2)setParameters()设置多个参数:

// String params
$qb->where('u.id = :uid')
   ->leftjoin('c.translations', 'ct', 'WITH', 'ct.locale = :locale')
   ->setParameters(array('locale' => 'fr', 'uid' => $userId));

// Numeric parameters are also available here
$qb->where('u.id = ?1')
   ->leftjoin('c.translations', 'ct', 'WITH', 'ct.locale = ?2')
   ->setParameters(array(2 => 'fr', 1 => $userId));

因此,您可能希望在查询构建器中使用setParameter()而不是setParameters()