使用ManyToOne关系实体,我如何访问外键ID?

时间:2019-02-18 14:58:41

标签: symfony doctrine entity

我正在尝试使用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的问题?

谢谢您的答复!

2 个答案:

答案 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();