我正在尝试使用doctrine和querybuilder访问存储在实体中的外键。
我得到了一个名为User的实体,该实体链接到另一个具有ManyToOne关系的Client实体。 我想构建一个querybuilder,使用户表中的client_id字段与客户端的ID相匹配。
我的用户实体:
/**
* AppBundle\EntityAppBundle\Entity\User
*
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
*/
class User extends FOSUser
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="nom", type="string", length=255)
*
*
*/
private $nom;
/**
*
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Etablissement", inversedBy="users")
*
*/
private $etablissements;
/**
*
* @ORM\ManyToOne(targetEntity="Client", inversedBy="users")
*
*/
private $client;
我的客户实体:
/**
* AppBundle\EntityAppBundle\Entity\Client
*
* @ORM\Table(name="client")
* @ORM\Entity()
*/
class Client{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nom", type="string", length=255)
*
*
*/
private $nom;
/**
* @var string
*
* @ORM\Column(name="adresse", type="string", length=255)
*
*
*/
/**
*
* @ORM\OneToMany(targetEntity="AppBundle\Entity\User", mappedBy="client",
cascade={"persist"}, orphanRemoval=true)
*
*/
private $users;
在我的数据库中,我的实体用户的外键列中有client_id。
因此,在UserRepository的queryBuilder中,我做了:
public function findClientIdViaUserId($myUserId, $myClientID)
{
return $this->createQueryBuilder('e')
->from('AppBundle:User', 'i')
->join('AppBundle:Client', 'c')
->where('c.id = :myClientID')
->andWhere('e.id = :myUserId')
->setParameter('myuserId', $myUserId)
->setParameter('myClientId', $myClientID)
->getQuery()
->getOneOrNullResult();
}
我希望获得一个user_id的client_id的ID。 假设我想获取一个名为user_id的client_id 1。 与我的queryBuilder我得到一个错误,如: [语法错误]行0,列67:错误:预期的Doctrine \ ORM \ Query \ Lexer :: T_WITH,得到了','
我该如何处理从user_id获取client_id的问题?
谢谢您的答复!
答案 0 :(得分:1)
您在链接方法方法时犯了一个错误。您已经通过调用createQueryBuilder('e')
为用户实体设置了别名。存储库知道它链接到的实体。
调用from('AppBundle:User', 'i')
时-用户实体的别名现在为i
。这就是为什么Doctrine在生成的DQL中抛出有关语法错误的错误。
因此,请尝试这段代码:
return $this
->createQueryBuilder('e')
->join('e.client', 'c')
->where('c.id = :myClientID')
->andWhere('e.id = :myUserId')
->setParameter('myUserId', $myUserId)
->setParameter('myClientId', $myClientID)
->getQuery()
->getOneOrNullResult();
答案 1 :(得分:1)
您为什么不使用EntityManager?
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('AppBundle:User')->find(YOURUSERID);
$client = $user->getClient();