Ошибка запроса Symfony2 (хотя то же самое работает в Doctrine2) - PullRequest
1 голос
/ 13 мая 2011

Я использую Doctrine2 и Symfony2, но Symfony2 не дает мне выполнить задачу, которую я могу выполнить в Doctrine2 («автономная» версия).

В Учении2:

У меня есть 2 класса, Исход, Билет как таковой:

namespace Entity;
/** @Entity @Table(name="tickets") */
class Ticket {
    /**  @Id @Column(type="integer") @GeneratedValue(strategy="AUTO") */
    private $id;
    /** @Column(type="string", length=100) */
    private $title;
    /** @OneToMany(targetEntity="Outcome", mappedBy="ticket") */
    private $outcomes;
    /* with setters and getters for title and outcomes */
    public function __toString() {
        return  $this->getTitle().' ('.$this->getId().')';
    }
    public function __construct () {
        $this->outcomes=new \Doctrine\Common\Collections\ArrayCollection();
    }
}

и

namespace Entity;
/** @Entity @Table(name="outcomes") */
class Outcome  {
    /** @Id @Column(type="integer") @GeneratedValue(strategy="AUTO") */
    private $id;
    /** @Column(type="string", length=100) */
    private $text;
    /** @ManyToOne(targetEntity="Ticket", inversedBy="outcomes") @JoinColumn(nullable=false) */
    private $ticket;
    public function __toString() {
        return  $this->getText().' ' .' ('.$this->getId().')';
    }
}

в моем index.php я использую

$query = $em->createQuery ("SELECT t,o FROM Entity\Ticket t LEFT JOIN t.outcomes o WHERE t.id=1");
$query->useResultCache(true);
$tickets_2 = $query->execute();
$ticket_2 = $tickets_2[0];
$amount=count($ticket_2->getOutcomes());
echo $ticket_2." --ticket\n";
echo $amount." --outcomes\n";

и я получаю правильный вывод

теперь в Symfony2 я использую следующие определения для сущностей:

namespace test\DemoBundle\Entity;
/** @orm:Entity @orm:Table(name="tickets") */
class Ticket {
    /**  @orm:Id @orm:Column(type="integer") 
         @orm:GeneratedValue(strategy="AUTO") */
    private $id;
    /** @orm:Column(type="string", length=100) */
    private $title;
    /** @orm:OneToMany(targetEntity="Outcome", mappedBy="response") */
    private $outcomes;
    ...
}
namespace test\DemoBundle\Entity;
/** @orm:Entity @orm:Table(name="outcomes") */
class Outcome  {
    /** @orm:Id @orm:Column(type="integer") @orm:GeneratedValue(strategy="AUTO") */
    private $id;
    /** @orm:Column(type="string", length=100) */
    private $text;
    /** @orm:ManyToOne(targetEntity="Ticket", inversedBy="outcomes") @orm:JoinColumn(nullable=false) */
    private $ticket;
    ....
}

Теперь я установил контроллер с функцией тестирования:

namespace test\DemoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use test\DemoBundle\Entity\Ticket as Ticket;
use test\DemoBundle\Entity\Outcome as Outcome;
class TicketController extends Controller { 
    ...
    public function testAction() {
        $em = $this->get('doctrine.orm.entity_manager');  
        $query = $em->createQuery ("SELECT t, o
            FROM test\DemoBundle\Entity\Ticket t  
            LEFT JOIN  t.outcomes o
            WHERE t.id=1");
        $query->useResultCache(true);
        $tickets_2 = $query->execute();
        $ticket_2 = $tickets_2[0];
        $amount=count($ticket_2->getOutcomes());
        $prepared_result=$ticket_2." --ticket ".$amount." --outcomes ";
        $response = new Response($prepared_result);
        return $response; 
    }
}

в этот момент я получаю сообщение об ошибке при попытке выполнить последний запрос следующим образом:

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 В синтаксисе SQL есть ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'WHERE t0_.id = 1' в строке 1

от webdebugger Я получаю следующий синтаксис от PDO:

SELECT t0_.id AS id0,
 t0_.title AS title1,
 o1_.id AS id2,
 o1_.text AS text3,
 o1_.ticket_id AS ticket_id4
FROM tickets t0_ 
LEFT JOIN WHERE t0_.id = 1

так что я думаю, что я пропустил что-то после ЛЕВОГО СОЕДИНЕНИЯ, поэтому я, во-первых, получаю сообщение об ошибке?

Что я делаю не так? / Что мне делать?

...