Symfony 小innerJoin查询
symfony 1.4和条令1.2中的旧查询Symfony 小innerJoin查询,symfony,doctrine-orm,Symfony,Doctrine Orm,symfony 1.4和条令1.2中的旧查询 $user = Doctrine_Query::create() ->from('User.u') ->innerJoin('u.State s') ->where('u.id = ?', $id) ->andWhere('u.state_id = ?', $state_id)
$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));
我的错误是:
无法识别的字段:状态
有什么问题
编辑:重新格式化的代码
更新
用户实体:
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);
}
}
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;
}
}
用户实体:
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);
}
}
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;
}
}
问题是用户实体中的变量是“state”而不是“stateId”。必须始终使用实体中的名称,而不是数据库中的名称。从用户到状态的连接也需要完成,因为stateId位于状态实体中 当需要连接时,最好使用queryBuilder或DQL 以下是一篇关于加入条令2 queryBuilder的帖子: 以下是Symfony教义书中的文档: 以下是我的项目中与您的问题非常相似的一个示例:
$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();
如果我不需要用户表中的任何内容,查询可以写成
$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();
多亏了彼得让我有点兴奋 如果您不想再次使用symfony2(-docs)和doctrine2的愚蠢解决方案,因为您需要比symfony1.4多得多的代码,就像这样。试试我的解决办法 结果如下
$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();
你能给我们看一下你的条令2的实体吗?你为什么不在条令2中使用查询生成器呢?当然可以。这里就是。对不起,不,如果我使用$user=$repository->findBy(数组('activationId'=>$activation\u id),数组('State'=>3));或者用“国家”和小盘股。错误仍在出现。您还需要执行从用户到状态的连接。好的,您介意为这两个表发布一个非常简单的查询示例吗?我对doctrine2非常陌生,我真的很笨。它和你的doctrine1.2代码非常相似。我在回答中添加了一个指向另一个帖子的链接。抱歉,我不能在这里给出一个明确的代码示例,我在iPad上,没有代码编辑器或测试平台。重点是,我需要一个实体管理器和innerJoin的小示例。我从来不需要使用它。我已经用查询生成器更新了我的答案。是的,谢谢,这也很有效。但有一点是我需要doctrine2中比doctrine1.2中更多的代码。但那是另一个故事!再次感谢!