Я пытаюсь получить доступ к внешнему ключу, хранящемуся в объекте, с помощью доктрины и построителя запросов.
У меня есть объект с именем Пользователь, который связан с другим объектом с именем Клиент с отношением ManyToOne. Я хотел создать построитель запросов, который даст мне поле client_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 в столбце внешнего ключа.
Итак, в моем queryBuilder в UserRepository я делаю:
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();
}
Я ожидаю получить идентификатор client_id для user_id. Допустим, я хотел получить один client_id с user_id, равным 1. С моим queryBuilder я получил ошибку, например: [Синтаксическая ошибка] строка 0, столбец 67: Ошибка: ожидаемая доктрина\ORM\Query\Lexer::T_WITH, получено ','
Как я могу получить client_id из user_id?
Спасибо за ваши ответы !




Вы сделали ошибку в цепочке методов Doctrine. Вы уже установили псевдоним для сущности пользователя, вызвав 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();
Почему бы вам не использовать EntityManager ?
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('AppBundle:User')->find(YOURUSERID);
$client = $user->getClient();