Doctrine 2 JOIN ON error - PullRequest
       31

Doctrine 2 JOIN ON error

1 голос
/ 20 января 2012

Я пытаюсь выполнить этот запрос в моем 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 'с сообщением' [Синтаксическая ошибка], строка 0, столбец 69: Ошибка: ожидаемый конец строки, включен 'ON' 'в /home/raccoon/web/freetopay.dev/www/class/new/library/Doctrine/ORM/Query/QueryException.php в строке 42

Это мои модели:

<?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

и юридическая сущность:

<?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;

Что не так

Ответы [ 3 ]

20 голосов
/ 20 октября 2013

Для тех, кто пришел сюда с вопросом о «Ожидаемый конец строки, получил« ВКЛ »», но не смог найти правильный ответ, так как я не смог (ну, есть ответ, но не совсем о QueryBuilder).В общем, да, вам не нужно указывать соединительные столбцы.Но что, если вам нужно добавить дополнительную фильтрацию?Например, я искал, чтобы добавить дополнительное условие (чтобы разрешить нулевые значения в соединении).

Проблема здесь в том, что, хотя константа Join :: ON существует (и комментарии в выражении Join также упоминают ее)В DQL нет ON.Вместо этого следует использовать WITH (Join :: WITH).

Вот мой пример использования:

$qb->leftJoin('p.metadata', 'm', Join::WITH, "IFNULL(m.name, '') = 'email'");

PS Прогнозирование вопросов о IFNULL() - это Бенджамин ЭберлейРасширение доктрины .

2 голосов
/ 20 января 2012

Здесь есть довольно четкое объяснение того, как JOIN работает с DQL здесь :

При использовании DQL при написании объединения это может быть фильтрующее соединение (аналогично концепции объединения в SQL, используемой для ограничения или агрегирования результатов) или извлечение соединения (используется для извлечения связанных записей и включения их в результат основной запрос). Когда вы включаете поля из объединенной сущности в предложение SELECT, вы получаете выборочное соединение

этого должно быть достаточно, чтобы получить то, что вы хотите (информация обо всех компаниях с загруженной правовой информацией):

$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:

Я использовал регулярное объединение в своем запросе, поэтому компании без юридической информации не будут возвращены в запросе. если вы хотите, чтобы компании ALL были загружены без официальной информации, попробуйте использовать левое соединение, как вы делали

1 голос
/ 20 января 2012

Мы оба думали с точки зрения SQL. Но в DQL WITH используется вместо ON. пример

Edit: Если вы знаете SQL, почему вы не используете запрос, такой как:

    $query = $this->getEntityManager()->createQuery('
        SELECT t...
    ');

Поместите туда SQL, который, по вашему мнению, должен быть там, проверьте его. Если это работает - проблема в коде Doctrine, если нет - ошибка в SQL / DQL

...