Doctrine 2 JOIN ON 错误 [英] Doctrine 2 JOIN ON error

查看:19
本文介绍了Doctrine 2 JOIN ON 错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试在我的 CompanyRepository 中执行此查询

I try to execute this query in my CompanyRepository

$qb = $this->_em->createQueryBuilder();
$qb->select(array('c', 'ld'))
        ->from('ModelEntityCompany', 'c')
        ->leftJoin('c.legaldetails', 'ld', DoctrineORMQueryExprJoin::ON, 'c.companyid=ld.companyid');

$query = $qb->getQuery();
echo($query->getSQL());

当我尝试这样做时出现错误:

When I try to do it I having error:

致命错误:未捕获的异常 'DoctrineORMQueryQueryException' 带有消息 '[Syntax Error] line 0, col 69:错误:预期的字符串结尾,在/home/raccoon 中得到了 'ON''/web/freetopay.dev/www/class/new/library/Doctrine/ORM/Query/QueryException.php 第 42 行

这些是我的模型:

<?php    
namespace ModelEntity;

use DoctrineORMMapping as ORM;
use DoctrineCommonCollectionsArrayCollection;

/**
 * Company
 *
 * @ORMTable(name="Company")
 * @ORMEntity(repositoryClass="ModelRepositoryCompanyRepository")
 */
class Company
{
/**
 * @var integer $companyid
 *
 * @ORMColumn(name="CompanyID", type="integer", nullable=false)
 * @ORMId
 * @ORMGeneratedValue(strategy="IDENTITY")
 */
private $companyid;

/**
 * @var ModelEntityLegalDetails $legaldetails
 *
 * @ORMOneToOne(targetEntity="ModelEntityLegaldetails", mappedBy="companyid")
 */
private $legaldetails;

//other fields

public function __construct()
{
    $this->legaldetails = new ArrayCollection();
}    

//setters and getters

和legaldetails实体:

and legaldetails entity:

<?php
namespace ModelEntity;

use DoctrineORMMapping as ORM;
use DoctrineCommonCollectionsArrayCollection;

/**
 * Legaldetails
 *
 * @ORMTable(name="LegalDetails")
 * @ORMEntity
 */
class Legaldetails
{
/**
 * @var integer $legalid
 *
 * @ORMColumn(name="LegalID", type="integer", nullable=false)
 * @ORMId
 * @ORMGeneratedValue(strategy="IDENTITY")
 */
private $legalid;

/**
 * @var ModelEntityCompany $company
 *
 * @ORMColumn(name="CompanyID", type="integer", nullable=false)
 * @ORMOneToOne(targetEntity="ModelEntityCompany", inversedBy="companyid")
 * @ORMJoinColumn(name="companyid", referencedColumnName="companyid")
 */
private $company;

怎么了?

推荐答案

关于 JOIN 如何与 DQL 协同工作有一个非常清晰的解释 这里:

There's a pretty clear explanation about how JOIN's work with DQL here:

使用 DQL 编写连接时,它可以是过滤连接(类似于 SQL 中用于限制或聚合结果的连接概念)或获取连接(用于获取相关记录并将它们包含在结果中)主要查询).当您在 SELECT 子句中包含来自连接实体的字段时,您将获得一个获取连接

With DQL when you write a join, it can be a filtering join (similar to the concept of join in SQL used for limiting or aggregating results) or a fetch join (used to fetch related records and include them in the result of the main query). When you include fields from the joined entity in the SELECT clause you get a fetch join

这应该足以获得您想要的东西(有关加载了法律信息的所有公司的信息):

this should be enough to get what you want (info about all companies with legal info loaded):

$query = $em->createQuery('SELECT c, ld FROM ModelEntityCompany c JOIN c.legaldetails ld');
$companies = $query->getResult(); // array of Company objects with the legaldetails association loaded

我在查询中使用了常规连接,因此查询中不会返回没有法律信息的公司.如果您想要所有公司,即使他们没有加载任何法律信息,您也应该像以前一样尝试使用左连接

i used a regular join in my query, so companies with no legal info won't be returned in the query. if you want ALL companies even though they have no legal info loaded you should try with the left join as you were doing

这篇关于Doctrine 2 JOIN ON 错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆