как восстановить один экземпляр среди нескольких экземпляров с помощью группы в symfony doctrine? - PullRequest
0 голосов
/ 17 июня 2020

Здесь у меня есть таблица бронирования, в которую входят врачи и пациенты ... Я бы хотел, чтобы количество посещений приходилось на одного врача. Однако в моем столе два врача с несколькими приемами. Поэтому я хотел бы, чтобы мой doctrine запрос возвратил мой список двух моих врачей с их общим количеством посещений, но вместо этого он вернет все экземпляры моих посещений.

Entity Booking booking table

Мой sql запрос в phpMyAdmin
вот результат, который мне нужен:

sql request

Мой контроллер

public function bookingbydocAction(Request $request){
    $user = $this->getUser();
    if ($user === null) {
        throw new NotFoundHttpException('Utilisateur Inexistant');
    } else {
        $em = $this->getDoctrine()->getManager();
        $medecin = $em->getRepository('DoctixMedecinBundle:Medecin')->findAll();
        $bookings = $em->getRepository('DoctixFrontBundle:Booking')->findBy(array('medecin' => $medecin));
  $nbbookhonored = $em->createQuery('SELECT COUNT(b.id) AS nbr_booking_honored FROM 
  DoctixFrontBundle:Booking b WHERE b.statut like :approved GROUP BY b.medecin' )- 
   >setParameter('approved', 'approved')->getResult();

         $nbbookbydoc = $em->createQuery('SELECT COUNT(b.id) AS nbr_booking_by_doc FROM 
   DoctixFrontBundle:Booking b GROUP BY b.medecin' )->getResult();
   $nbbookhonored = $nbbookhonored[0]['nbr_booking_honored'];
        $nbbookbydoc = $nbbookbydoc[0]['nbr_booking_by_doc'];

        return $this->render('DoctixAdminBundle:User:booking_medecin.html.twig', array(
            'bookings' => $bookings,
            'nbbookhonored' => $nbbookhonored,
            'nbbookbydoc' => $nbbookbydoc

        ));
    }
}

My view Twig

<div class="table-responsive-sm">

                        <table class="table table-sm table-bordered" id="dataTable" width="100%" cellspacing="0">

                            <thead>
                            <tr>
                                <th>#</th>
                                <th>NOM COMPLET</th>
                                <th>EMAIL</th>
                                <th>TÉLÉPHONE</th>
                                <th>NOMBRE RENDEZ-VOUS</th>
                                <th>HONORES</th>
                            </tr>
                            </thead>
                            <tfoot>
                            <tr>
                                 <th>#</th>
                                <th>NOM COMPLET</th>
                                <th>EMAIL</th>
                                <th>TÉLÉPHONE</th>
                                <th>NOMBRE RENDEZ-VOUS</th>
                                <th>HONORES</th>
                            </tr>
                            </tfoot>
                            <tbody>

                            {% for booking in bookings %} 
                                <tr>
                                    <td>{{ loop.index }}</td> 
                                    <td>{{ booking.medecin.user.prenom|capitalize }} {{ booking.medecin.user.nom|upper }}</td>
                                    <td>
                                        {{ booking.medecin.user.username }}
                                    </td>
                                    <td>{{ booking.medecin.user.numTel }}</td>

                                    <td>{{ nbbookbydoc }}</td>
                                    <td>
                                        {{ nbbookhonored }}
                                    </td>
                                </tr>
                             {% endfor %}  
                            <div class="navigation">  </div>

                            </tbody>
                        </table>
                    </div>

Результат вид view's result

Проблема в том, что он дает мне представление обо всех происшествиях двух врачей, которые записались на прием, или я хотел бы, чтобы он принес мне только один экземпляр каждого врача с общим количеством их соответствующих посещений.

Репозиторий

public function findByBooking(){
    $qb = $this->createQueryBuilder('d')
    ->select('d.id, m.nom, m.prenom, m.username, m.numTel, COUNT(b.id) AS bookingsCount')
    ->join('d.bookings', 'b')
    ->join('d.user', 'm')
    ->groupBy('d.id');
    return $qb->getQuery()->getResult();
}

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Мое решение с моим репо

public function findByBooking(){
    $qb = $this->createQueryBuilder('d')
    ->select('d.id, m.nom, m.prenom, m.username, m.numTel, COUNT(b.id) AS bookingsCount, SUM(CASE WHEN b.statut like :approved THEN 1 ELSE 0 END) AS bookingshonored')
    ->join('d.bookings', 'b')
    ->join('d.user', 'm')
    ->setParameter('approved', 'approved')
    ->groupBy('d.id');
    return $qb->getQuery()->getResult();
}
0 голосов
/ 17 июня 2020

В качестве наилучшей практики с Doctrine вы должны использовать репозитории:

https://symfony.com/doc/4.4/doctrine.html

Вы должны изменить это «нравится» на '=' для оптимизации. Вы не используете подстановочные знаки (%).

Основная проблема - ваш запрос. Вам нужно просто объединить таблицы с помощью построителя запросов, а затем использовать группу по всем столбцам, кроме счетчика. Просто убедитесь, что все столбцы, по которым вы группируете, также находятся в вашем выборе.

edit Имейте в виду, что я не знаю структуру вашей сущности, но что-то вроде этого:

$qb = $this->createQueryBuilder('booking');

return $qb->select('count(booking.id) as nbr_booking_by_doc, medecin.id, medecin.name')
    ->innerJoin('booking.medecin', 'medecin')
    ->innerJoin('booking.patient')
    ->where('booking.statut = :statut')
    ->groupBy('medecin.id')
    ->addGroupBy('medecin.name')
    ->setParameter('statut', 'approved')
    ->getQuery()
    ->getResult();

edit 2 Вот еще один вопрос по SO, который отвечает на ваш вопрос о получении как общего количества, так и отфильтрованного количества в одном запросе.

sql получить общее и отфильтрованное количество в одном запросе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...