我有一个包含2个表的数据库模型:用户和实验。关系是n:n,所以我用2个外键创建了第三个表。
|实验| 1 ------- 0..n | ExperimentationUser | 0..n ------- 1 |用户|
由于Doctrine(带注释)生成了实体。我有UserEntity和ExperimentationEntity,但没有ExperimentationUserEntity。当我查看USerEntity时,我可以找到“相关实验ID”的集合。
我想获得指定用户的所有实验名称(而不是ID)。在常见的SQL中,我将使用WHERE子句(用于用户ID选择)加入Experimentation和ExperimentationUser。但是因为我正在开始一个Symfony(2.8)项目,所以我想使用QueryBuilder。
我不熟悉语法,我不知道如何实现这一点。我尝试过:
$repository = $this->getDoctrine()->getRepository('AppBundle:Experimentation');
$query = $repository->createQueryBuilder('e')
->join('...')
->setParameter('id',$id)
->getQuery();
但我不知道在join
条款中放什么。我甚至不确定是否需要它。
感谢您的帮助!
答案 0 :(得分:2)
这就是我做这种事情的方式。我不使用查询构建器,但你明白了。
在实体
中namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Experimentation
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="AppBundle\Entity\ExperimentationRepository")
*/
class Experimentation
{
//...
}
在存储库类
中namespace AppBundle\Entity;
use Doctrine\ORM\EntityRepository;
class ExperimentationRepository extends EntityRepository
{
public function getExperimentationByUser($id) {
$em = $this->getEntityManager();
$query = $em->createQuery('SELECT e '
. 'FROM AppBundle:Experimentation e '
. 'JOIN e.experimentationUsers eu '
. 'JOIN eu.user u '
. 'WHERE u.id = :id ')
->setParameter('id', $id);
return $query->getResult();
}
}
然后在控制器中
//..
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('AppBundle:Experimentation')->getExperimentationByUser($user_id);
//..
通过这种方式,您可以获得实验列表,然后获取它的名称,或者也可以在仅$query = $em->createQuery('SELECT e.name '
的查询中获取。如果您还需要与用户相关的数据,可以放$query = $em->createQuery('SELECT e, u '
,可能还可以保存一些数据库请求。
我希望这对你有所帮助。