Использую Symfony. Определил вот такую связь
//Entity MatchStat
/**
* @ORM\OneToMany(targetEntity="MatchPlayers", mappedBy="match")
*/
private $players;
------------------------------------------------------------------
//Entity MatchPlayers
/**
* @ORM\ManyToOne(targetEntity="MatchStat", inversedBy="players")
* @ORM\JoinColumn(name="match_id", referencedColumnName="id")
*/
private $match;
Теперь вытягиваю записи таким запросом
public function index()
{
$ms = $this->getDoctrine()->getRepository(MatchStat::class)->findBy(['league_id' => 10869]);
return $this->render('app/index.html.twig', [
'ms' => $ms
]);
}
И вот в шаблоне твига если я пишу
{% for match in ms %}
<p>{{match.getMatchId}}</p>
{% for player in match.getPlayers %}
<div>{{player.persona}}</div>
{% endfor %}
{% endfor %}
то метод getPlayers() вытягивает записи по одному запросу селектом. Получается, если на странице по 100 записей, то будет 101 селект - первый список матчей, и 100 запросов на получение игроков в каждом матче.
Вопрос: насколько это правильно? я помню в CakePHP это выглядело в стиле
LEFT JOIN MatchPlayers WHERE match_id in (...)
, т.е. нужно было всего два запроса - на главную таблицу и на ассоциацию.
Как это правильно реализовать с помощью доктрины?
findBy
поддерживает конструкцию IN
Мануал
$ms = $this->getDoctrine()->getRepository(MatchStat::class)->findBy(['league_id' => 10869]);
// Получаем массив id
$ids = array_map(function($entry) {
return $entry->getId()
}, $ms);
// Получаем игроков по массиву id (IN)
$players = $this->getDoctrine->getRepository(MatchPlayers::class)->findBy([
'match' => $ids
]);
Но рациональней будет написать функцию в репозитории, которая будет получать нужные сущности по вашему условию
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Требуется помощь в решении вопроса, касающегося запросов в базу данных и их отображения на html страницеЕсть запрос с двумя параметрами :p1 и :p2, эти...
как вывести из базы с обрезанием по символам, желательно слова не отрезать
Проблема в том что у меня в БД mysql имеется 2 таблицы,и мне надо как-то одновременно из этих таблиц выводить значения
Возможно вопрос глупый, но, видимо глаз уже замылился и не вижу очевидногоПри работе с классом возникла такая ошибка: Uncaught Error: Call to a member function...