Как видно из названия государств,Symfony/Doctrine отношение COUNT в сущности
Я хотел бы выполнить 1 запрос, чтобы получить результаты из таблицы с графом их соответствующих отношений.
Допустим, у меня есть Person
сущность с отношения OneToMany с Friend
лица
Человек лица может выглядеть примерно следующим:
class Person
{
/**
* @ORM\OneToMany(...)
*/
protected $friends;
public function __construct()
{
$this->friends = new ArrayCollection();
}
...
}
классический SQL решение, что я хочу для достижения может выглядеть следующим образом:
SELECT p.*, COUNT(f.id) as friendsCount
FROM Persons p
LEFT JOIN Friends f
ON f.person_id = p.id
GROUP BY p.id
Теперь мне интересно, если это может быть сделано в DQL, а также и хранения счета значение в Person
Entity
Допустим, я расширитьPerson
объект как: (Имейте в виду, что это только идея)
class Person
{
/**
* @ORM\OneToMany(...)
*/
protected $friends;
protected $friendsCount;
public method __construct()
{
$this->friends = new ArrayCollection();
}
...
public function getFriendsCount()
{
return $this->friendsCount;
}
}
Теперь у меня возникли проблемы с поиском, как я мог бы заполнить значение счета в сущности из DQL:
SELECT p, /* What comes here ? */
FROM AppBundle\Entity\Person p
LEFT JOIN p.friends f
GROUP BY p.id
PS: Я KNO w Я мог бы просто:
$person->getFriends()->count();
И даже отметьте его как лишний, чтобы получить результат подсчета.
Я только что это кол-во отношений пример хорошо продемонстрировал то, что я пытаюсь сделать.
(Который заселение не являющиеся @ORM\Column
свойств аудируемых от DQL)
возможен ли это с доктриной?
Является ли это нарушением некоторых твердых принципов? (SRP?)
Cookie для thoughs;)
Большое спасибо за этот пример! Действительно полезно – RVandersteen
Имейте в виду, что это не обязательно. Если вы просто явно присоединяетесь к вызову репозитория, как это, вы можете просто удалить 'COUNT()' и возвращать сущности, как обычно, а затем поместить 'return $ this-> friends-> count()' в свой 'getFriendsCount()' метод. Если вы явно присоединитесь к нему, он не добавит другого вызова базы данных ... и если вы еще не загрузили их, это произойдет. –
Действительно, я даже не могу явно использовать getFriendsCount() и использовать getFriends() -> count(), где мне это нужно после объединения. Но эта техника может оказаться полезной для некоторых специальных запросов. Каким бы вы ни были (очень) большое количество отношений и производительности. Присоединение (и, следовательно, увлажнение) большого количества сущностей только для того, чтобы получить счет, может замедлить работу. Просто думать (писать) вслух :) – RVandersteen