Ela*_*hts 5 doctrine inner-join dql query-builder symfony
我知道我有一个语法,但是我无法弄明白.我正在尝试对5个表进行SELECT和INNER JOIN,但Symfony抱怨JOIN中的实体在定义之前使用.
实际错误如下: [Semantical Error] line 0, col 121 near 'I ON C.id = ': Error: Identification Variable MySiteBundle:Items used in join path expression but was not defined before.
这是PHP代码.
注意:我已将此查询缩短为两列,两个表和一个联接,以使问题简单并显示我的观点.实际查询更长,并产生相同的错误.
$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery(
'select C.name as CName, I.id as IId
FROM MySiteBundle:Categories C
INNER JOIN MySiteBundle:Items I ON C.id = I.category_id');
$result = $query->getResult();
Run Code Online (Sandbox Code Playgroud)
更新
正如所建议的那样,我已经废除了DQL代码并使用了Query Builder代码.我得到一个非常类似的错误'Categories c': Error: Class 'Categories' is not defined
.我的QB代码如下.
$em = $this->getDoctrine()->getEntityManager();
$qb = $em->createQueryBuilder()
->select('c.name, i.id, i.image, i.name, i.description, m.id, m.quantity, m.value, m.qty_received, m.custom_image, m.custom_name, m.custom_description, u.user1fname, u.user1lname, u.user2fname, u.user2lname')
->from('Categories', 'c')
->innerJoin('Items', 'i', 'ON', 'c.id = i.category_id')
->innerJoin('MemberItems', 'm', 'ON', 'i.id = m.item_id')
->innerJoin('User', 'u', 'ON', 'm.memberinfo_id = u.id')
->where('u.id = ?', $slug)
->orderBy('c.id', 'ASC')
->getQuery();
$memberItems = $qb->getResult();
Run Code Online (Sandbox Code Playgroud)
有什么建议?
路易斯在我打字时发布了.那好吧.
DQL根据您的关联为您处理联接详细信息.通常,您只需要拼出FROM类名称.就像是:
'select C.name as CName, I.id as IId
FROM MySiteBundle:Categories C
INNER JOIN C.items');
Run Code Online (Sandbox Code Playgroud)
并最终使用查询生成器.
================================================== ===========================
以下是在Symfony 2中使用查询构建器的示例.
public function getAccounts($params = array())
{
// Build query
$em = $this->getEntityManager();
$qb = $em->createQueryBuilder();
$qb->addSelect('account');
$qb->addSelect('accountPerson');
$qb->addSelect('person');
$qb->addSelect('registeredPerson');
$qb->addSelect('projectPerson');
$qb->from('ZaysoCoreBundle:Account','account');
$qb->leftJoin('account.accountPersons', 'accountPerson');
$qb->leftJoin('accountPerson.person', 'person');
$qb->leftJoin('person.registeredPersons','registeredPerson');
$qb->leftJoin('person.projects', 'projectPerson');
$qb->leftJoin('projectPerson.project', 'project');
if (isset($params['accountId']))
{
$qb->andWhere($qb->expr()->in('account.id',$params['accountId']));
}
if (isset($params['projectId']))
{
$qb->andWhere($qb->expr()->in('project.id',$params['projectId']));
}
if (isset($params['aysoid']))
{
$qb->andWhere($qb->expr()->eq('registeredPerson.regKey',$qb->expr()->literal($params['aysoid'])));
}
$query = $qb->getQuery();
//die('DQL ' . $query->getSQL());
return $query->getResult();
}
Run Code Online (Sandbox Code Playgroud)
DQL 不使用这样的联接。它们有点简化。然而我也发现它们的记录不足。
$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery(
'select C.name as CName, I.id as IId
FROM MySiteBundle:Categories C
INNER JOIN C.items I');
$result = $query->getResult();
Run Code Online (Sandbox Code Playgroud)
实际使用的关系取决于您的模型。
我通常使用查询生成器。
$em = $this->getEntityManager();
$request = $em->getRepository('MySiteBundle:Categories');
$qb = $request->createQueryBuilder('C');
$query = $qb
->select('C.name, I.id')
->innerJoin('C.items', 'I')
->getQuery();
Run Code Online (Sandbox Code Playgroud)