教条2加注错误 [英] Doctrine 2 JOIN ON error

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

问题描述

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

  $ qb = $ this-> _em-> createQueryBuilder ); 
$ qb-> select(array('c','ld'))
- > from('Model\Entity\Company','c')
- > leftJoin('c.legaldetails','ld',\Doctrine\ORM\Query\Expr\Join :: ON,'c.companyid = ld.companyid');

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

当我尝试这样做时,我有错误:



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



这些是我的模型:

 <?php 
命名空间Model \Entity;

使用Doctrine\ORM\Mapping作为ORM;
使用Doctrine\Common\Collections\ArrayCollection;

/ **
*公司
*
* @ ORM\Table(name =Company)
* @ ORM\Entity repositoryClass =\Model\Repository\CompanyRepository)
* /
class公司
{
/ **
* @var整数$ companyid
*
* @ ORM\Column(name =CompanyID,type =integer,nullable = false)
* @ ORM\Id
* @ ORM\GeneratedValue (strategy =IDENTITY)
* /
private $ companyid;

/ **
* @var \Model\Entity\LegalDetails $ legaldetails
*
* @ ORM\OneToOne(targetEntity =\ model \Entity\Legaldetails,mappedBy =companyid)
* /
private $ legaldetails;

//其他字段

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

// setters和getters

和legaldetails实体:

 <?php 
命名空间Model \Entity;

使用Doctrine\ORM\Mapping作为ORM;
使用Doctrine\Common\Collections\ArrayCollection;

/ **
* Legaldetails
*
* @ ORM\Table(name =LegalDetails)
* @ ORM\Entity
* /
class LegalDetails
{
/ **
* @var整数$ legalid
*
* @ ORM\Column =LegalID,type =integer,nullable = false)
* @ ORM\Id
* @ ORM\GeneratedValue(strategy =IDENTITY)
* /
private $ legalid;

/ **
* @var \Model\Entity\Company $ company
*
* @ ORM\Column(name =CompanyID ,type =integer,nullable = false)
* @ ORM\OneToOne(targetEntity =\Model\Entity\Company,inversedBy =companyid)
* @ ORM\\ \\JoinColumn(name =companyid,referencedColumnName =companyid)
* /
private $ company;

有什么问题?

解决方案

有一个很清楚的解释,说明JOIN如何使用DQL 这里


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


这应该足以得到你想要的有关所有加盟合法信息的公司的信息):

  $ query = $ em-> createQuery('SELECT c,ld FROM \Model\Entity\Company c JOIN c.legaldetails ld'); 
$ companies = $ query-> getResult(); //加载法定详细信息关联的公司对象数组

编辑: / p>

我使用了我的查询中的常规加入,所以没有合法信息的公司将不会在查询中返回。如果您想要所有公司,即使他们没有加载法律信息​​,您应该尝试使用左侧的加入,如您所做


I try to execute this query in my CompanyRepository

$qb = $this->_em->createQueryBuilder();
$qb->select(array('c', 'ld'))
        ->from('Model\Entity\Company', 'c')
        ->leftJoin('c.legaldetails', 'ld', \Doctrine\ORM\Query\Expr\Join::ON, 'c.companyid=ld.companyid');

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

When I try to do it I having error:

Fatal error: Uncaught exception 'Doctrine\ORM\Query\QueryException' with message '[Syntax Error] line 0, col 69: Error: Expected end of string, got 'ON'' in /home/raccoon/web/freetopay.dev/www/class/new/library/Doctrine/ORM/Query/QueryException.php on line 42

These are my models:

<?php    
namespace Model\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Company
 *
 * @ORM\Table(name="Company")
 * @ORM\Entity(repositoryClass="\Model\Repository\CompanyRepository")
 */
class Company
{
/**
 * @var integer $companyid
 *
 * @ORM\Column(name="CompanyID", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $companyid;

/**
 * @var \Model\Entity\LegalDetails $legaldetails
 *
 * @ORM\OneToOne(targetEntity="\Model\Entity\Legaldetails", mappedBy="companyid")
 */
private $legaldetails;

//other fields

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

//setters and getters

and legaldetails entity:

<?php
namespace Model\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Legaldetails
 *
 * @ORM\Table(name="LegalDetails")
 * @ORM\Entity
 */
class Legaldetails
{
/**
 * @var integer $legalid
 *
 * @ORM\Column(name="LegalID", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $legalid;

/**
 * @var \Model\Entity\Company $company
 *
 * @ORM\Column(name="CompanyID", type="integer", nullable=false)
 * @ORM\OneToOne(targetEntity="\Model\Entity\Company", inversedBy="companyid")
 * @ORM\JoinColumn(name="companyid", referencedColumnName="companyid")
 */
private $company;

What is wrong?

解决方案

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

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 \Model\Entity\Company c JOIN c.legaldetails ld');
$companies = $query->getResult(); // array of Company objects with the legaldetails association loaded

EDIT:

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

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

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