С помощью сущностей отношений ManyToOne, как я могу получить доступ к идентификатору внешнего ключа? - PullRequest
0 голосов
/ 18 февраля 2019

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

Я получил сущность с именем User, которая связана с другой сущностью, называемой Client, с отношением 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: Ошибка: Ожидаемый Doctrine \ ORM \ Query \ Lexer :: T_WITH, получил ', '

Как мне обработать получение client_id от user_id?

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

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Почему вы не используете EntityManager?

$em = $this->getDoctrine()->getManager();

$user = $em->getRepository('AppBundle:User')->find(YOURUSERID);

$client = $user->getClient();
0 голосов
/ 18 февраля 2019

Вы ошиблись в цепочке методов Доктрины.Вы уже установили псевдоним для сущности пользователя, вызвав 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();
...