Связь OneToMany в Doctrine

162
15 января 2020, 18:40

Использую 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 (...), т.е. нужно было всего два запроса - на главную таблицу и на ассоциацию.

Как это правильно реализовать с помощью доктрины?

Answer 1

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
]);

Но рациональней будет написать функцию в репозитории, которая будет получать нужные сущности по вашему условию

READ ALSO
Отображение базы данных с помощью Java Script (Ajax)

Отображение базы данных с помощью Java Script (Ajax)

Требуется помощь в решении вопроса, касающегося запросов в базу данных и их отображения на html страницеЕсть запрос с двумя параметрами :p1 и :p2, эти...

132
Laravel обрезание текса в php с сохранением слов

Laravel обрезание текса в php с сохранением слов

как вывести из базы с обрезанием по символам, желательно слова не отрезать

101
Подключение двух таблиц к одному .php

Подключение двух таблиц к одному .php

Проблема в том что у меня в БД mysql имеется 2 таблицы,и мне надо как-то одновременно из этих таблиц выводить значения

109
Помогите разобраться с ошибкой Call to a member function getActiveSheet() on null

Помогите разобраться с ошибкой Call to a member function getActiveSheet() on null

Возможно вопрос глупый, но, видимо глаз уже замылился и не вижу очевидногоПри работе с классом возникла такая ошибка: Uncaught Error: Call to a member function...

120