2013-01-26 3 views
0

Старый Query в симфони 1.4 и доктрина 1,2Маленький innerJoin-запрос

$user = Doctrine_Query::create() 
       ->from('User.u') 
       ->innerJoin('u.State s') 
       ->where('u.id = ?', $id) 
       ->andWhere('u.state_id = ?', $state_id) 
       ->fetchOne(); 

Теперь мой запрос в Symfony2:

$repository = $this->getDoctrine() 
->getRepository('FrontendAccountBundle:User'); 

$user = $repository->findBy(array(
    'activationId' => $activation_id), 
    array('state' => 3)); 

Моя ошибка пришедшего вверх:

Непризнанный поле: состояние

В чем проблема?

Edit: переформатировать код

Update

User-Entity:

namespace Frontend\AccountBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Security\Core\User\UserInterface; 

/** 
* User 
* 
* @ORM\Table(name="user") 
* @ORM\Entity 
*/ 
class User implements UserInterface, \Serializable 
{ 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="activation_id", type="string", length=255, nullable=true) 
    */ 
    private $activationId; 


    /** 
    * @var \State 
    * 
    * @ORM\ManyToOne(targetEntity="State") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="state_id", referencedColumnName="id") 
    * }) 
    */ 
    private $state; 




    /** 
    * Set activationId 
    * 
    * @param string $activationId 
    * @return User 
    */ 
    public function setActivationId($activationId) 
    { 
     $this->activationId = $activationId; 

     return $this; 
    } 

    /** 
    * Get activationId 
    * 
    * @return string 
    */ 
    public function getActivationId() 
    { 
     return $this->activationId; 
    } 

    /** 
    * Set state 
    * 
    * @param \Frontend\AccountBundle\Entity\State $state 
    * @return User 
    */ 
    public function setState(\Frontend\AccountBundle\Entity\State $state = null) 
    { 
     $this->state = $state; 

     return $this; 
    } 

    /** 
    * Get state 
    * 
    * @return \Frontend\AccountBundle\Entity\State 
    */ 
    public function getState() 
    { 
     return $this->state; 
    } 

    public function __construct() 
    { 
     $this->isActive = true; 
     $this->salt = md5(uniqid(null, true)); 
    } 

    /** 
    * @inheritDoc 
    */ 
    public function getUsername() 
    { 
     return $this->email; 
    } 
    /** 
    * @see \Serializable::serialize() 
    */ 
    public function serialize() 
    { 
     return serialize(array(
      $this->id, 
     )); 
    } 

    /** 
    * @see \Serializable::unserialize() 
    */ 
    public function unserialize($serialized) 
    { 
     list (
      $this->id, 
     ) = unserialize($serialized); 
    } 
} 

User-Entity:

namespace Frontend\AccountBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

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

    /** 
    * @var string 
    * 
    * @ORM\Column(name="state", type="string", length=255, nullable=false) 
    */ 
    private $state; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="description", type="string", length=255, nullable=false) 
    */ 
    private $description; 



    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set state 
    * 
    * @param string $state 
    * @return State 
    */ 
    public function setState($state) 
    { 
     $this->state = $state; 

     return $this; 
    } 

    /** 
    * Get state 
    * 
    * @return string 
    */ 
    public function getState() 
    { 
     return $this->state; 
    } 

    /** 
    * Set description 
    * 
    * @param string $description 
    * @return State 
    */ 
    public function setDescription($description) 
    { 
     $this->description = $description; 

     return $this; 
    } 

    /** 
    * Get description 
    * 
    * @return string 
    */ 
    public function getDescription() 
    { 
     return $this->description; 
    } 
} 
+0

Можете ли вы показать нам свою сущность для Doctrine 2, также почему вы не использовали построитель запросов в Doctrine 2? –

+0

Да, конечно, я могу это сделать. Вот. – craphunter

ответ

1

Проблема заключается в том, что переменная в пользовательском объект «state» не «stateId». Вы всегда должны использовать имена из объекта, а не базы данных. Присоединение от пользователя к государству также необходимо выполнить, так как stateId находится в государственном образовании.

Когда необходимы соединения, вам, вероятно, лучше использовать queryBuilder или DQL.

Вот пост о присоединяется к доктрине 2 QueryBuilder: doctrine 2 query builder and join tables

Вот документация от Symfony книги для доктрины: http://symfony.com/doc/current/book/doctrine.html#entity-relationships-associations

Вот пример из моего проекта, который очень похож на вашу проблему:

$uid = 2; 
    $rep = $this->getDoctrine()->getRepository('DevondevTrackRTimeBundle:Activity'); 
    $q = $rep->createQueryBuilder('a') 
     ->select ('a.activityId, a.startTime, a.endTime, u.username') 
     ->join('a.login','u') 
     ->where('u.id = :uid') 
     ->setParameter('uid', $uid) 
     ->getQuery(); 

    $acts = $q->getResult(); 

Если я ничего из таблицы пользователя, запрос может быть записан в виде

не нужен 10
$uid = 2; 
    $rep = $this->getDoctrine()->getRepository('DevondevTrackRTimeBundle:Activity'); 
    $q = $rep->createQueryBuilder('a') 
     ->where('a.login = :uid') 
     ->setParameter('uid', $uid) 
     ->getQuery(); 

    $acts = $q->getResult(); 

Это ваш запрос переработан таким же образом:

$rep = $this->getDoctrine()->getRepository('FrontendAccountBundle:User'); 
    $q = $rep->createQueryBuilder('u') 
     ->join('u.state','s') 
     ->where ('u.id = :uid') 
     ->andWhere ('s.stateId = :sid') 
     ->setParameters(array('uid' => $id, 'sid' => $state_id))    
     ->getQuery(); 

    $user = $q->getSingleResult();   
+0

Извините, нет, если я использую $ user = $ repository-> findBy (array ('activationId' => $ activation_id), array ('State' => 3)); или с «состоянием» с небольшой крышкой. Ошибка все еще возникает. – craphunter

+0

Вам также необходимо выполнить соединение с пользователем. –

+0

Хорошо, не возражаете ли вы разместить пример этого очень простого запроса с этими двумя таблицами? Я очень новичок в доктрине2, и я действительно застрял. – craphunter

0

Благодаря Петру освещающие меня немного !!!

Если вы больше не хотите глупого решения от symfony2 (-docs) и doctrine2, потому что вам нужно гораздо больше кода, чем в symfony1.4, например, http://symfony.com/doc/current/book/doctrine.html#joining-to-related-records. Попробуйте мое решение.

Вот результат.

 $em = $this->getDoctrine()->getEntityManager(); 
     $user = $em->createQuery('SELECT u FROM FrontendAccountBundle:User u 
       INNER JOIN FrontendAccountBundle:State s 
       WHERE 
       u.activation_id=:activation_id 
       and 
       u.state=:state_id 
       ') 
      ->setParameter('activation_id', $activation_id) 
      ->setParameter('state_id', 3) 
      ->getSingleResult(); 
+0

Я обновил свой ответ, как это сделать, используя построитель запросов. –

+0

Да, спасибо, это тоже работает. Но это связано с тем, что мне нужно больше кода в доктрине2, чем в доктрине1.2. Но это уже другая история! Еще раз спасибо! – craphunter

Смежные вопросы