Symfony 非对象上的QueryBuilder

Symfony 非对象上的QueryBuilder,symfony,doctrine,translation,Symfony,Doctrine,Translation,我想创建一个多语言网站,为此,我将Symfony与PrezentBundle和A2lixBundle一起使用。我将通过实体repo按区域设置获取数据列表 我有一个错误: FatalErrorException: Error: __clone method called on non-object in /project/vendor/doctrine/orm/lib/Doctrine/ORM/QueryBuilder.php line 238 这是我的回购协议: $qb = $this->

我想创建一个多语言网站,为此,我将Symfony与
PrezentBundle
A2lixBundle
一起使用。我将通过实体repo按区域设置获取数据列表

我有一个错误:

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\u dump
告诉我:

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

您的问题可能是因为误用了
setParameters()
method。条令查询生成器有两种类似的方法:

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

您的问题可能是因为误用了
setParameters()
方法。条令查询生成器有两种类似的方法:

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

我建议您将可翻译条令扩展与用于i18n的jms/i18n路由捆绑包结合使用。我已经对StofOctrineExtensionsBundle进行了一些测试,但有了另一个问题^^我只想说,可翻译是真正经过测试和稳定的扩展,在很多网站上都能工作。。。而不是你试图实现的捆绑包。你说的是StofDoctrineExtensionsBundle或其他捆绑包中的可翻译?谢谢你的回答。我在这篇文章中找到了Prezent:他似乎说Gedmo不受欢迎。也许我错过了什么。Gemdo不再积极发展了。但是您可以使用来自的
DoctrineBehaviours
。我建议您将可翻译的条令扩展与用于i18n的jms/i18n路由捆绑包结合使用。我已经使用StofOctrineExtensionsBundle进行了一些测试,但我还有另一个问题^^我只想说,可翻译是真正经过测试和稳定的扩展,在很多网站上都能工作。。。而不是你试图实现的捆绑包。你说的是StofDoctrineExtensionsBundle或其他捆绑包中的可翻译?谢谢你的回答。我在这篇文章中找到了Prezent:他似乎说Gedmo不受欢迎。也许我错过了什么。Gemdo不再积极发展了。但是你可以使用来自的
DoctrineBehaviours
。这么简单的错误。。。谢谢你!这么简单的错误。。。谢谢你!