С объектами отношения ManyToOne, как я могу получить доступ к идентификатору внешнего ключа?

Я пытаюсь получить доступ к внешнему ключу, хранящемуся в объекте, с помощью доктрины и построителя запросов.

У меня есть объект с именем Пользователь, который связан с другим объектом с именем Клиент с отношением 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?

Спасибо за ваши ответы !

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы сделали ошибку в цепочке методов 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();

Другие вопросы по теме