Получение заданного элемента в коллекции ArrayCollection Doctrine - PullRequest
0 голосов
/ 18 февраля 2019

Разработка API, в котором в начале каждого запроса предоставленный ключ API используется для получения объекта Account, связанного с запросом.

$account = $em->getRepository(Entity\Account\Account::class)
              ->findOneBy(['mainKey'=>$request->getHeaderLine('X-API-Key')]);

Эта сущность Account содержит пользовательский ArrayCollectionгде каждая из сущностей пользователя содержит свойство username, которое является уникальным для данной учетной записи.

Учитывая имя пользователя, как я могу получить сущность пользователя?Я могу сделать что-то вроде следующего, однако, я чувствую, что должен поступить по-другому.

$user = $em->getRepository(Entity\Account\User::class)
           ->findOneBy(['accountId'=>$account->getId(), 'username'=>'John.Doe']);

Спасибо,

PS.Я предполагаю, что findOneBy() использует подготовленный оператор за кулисами и не подлежит внедрению SQL, верно?

PSS.Я просто предположил, что ArrayCollection содержит группу объектов, но, глядя на некоторые документы, теперь я не уверен.

Ответы [ 2 ]

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

Оба этих подхода работают:

$criteria = \Doctrine\Common\Collections\Criteria::create()
->where(\Doctrine\Common\Collections\Criteria::expr()->eq("username", $username));
$user = $users->matching($criteria)->current();

$expr = new \Doctrine\Common\Collections\Expr\Comparison('username', '=', $username);
$criteria = new \Doctrine\Common\Collections\Criteria();
$criteria->where($expr);
$user = $users->matching($criteria)->current();
0 голосов
/ 18 февраля 2019

Если Account связано с User (я полагаю, это однозначно), тогда Account должно иметь определенное свойство $user.И вы можете получить к нему доступ:

$user = $account->getUser();

Где getUser:

public function getUser()
{
    return $this->user;
}
...