Как показать все записи с множественными отношениями «один ко многим» и «многие ко многим» с php pdo?

#php #mysql #pdo

#php #mysql #pdo

Вопрос:

Я хочу показать все мои записи doctors с их отношениями с другими таблицами, но отображается только одна запись из этих отношений, например, из контактов; у нее два контакта, но только один отображается для доктора. Как я могу показать все это?

 $sql = "SELECT doctors.name, doctors.floor, doctors.room_no, doctors.clinic_address, 
        doctors_schedules.schedule, 
        doctors_contacts.contact_number, doctors_specialties.specialties_id FROM doctors 
        INNER JOIN doctors_schedules ON doctors.id = doctors_schedules.doctor_id
        INNER JOIN doctors_contacts ON doctors.id = doctors_contacts.doctor_id
        INNER JOIN doctors_specialties ON doctors.id = doctors_specialties.doctor_id  
        GROUP BY doctors.id";

        $stmt = $db->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll();
  

таблица врачей

doctors_contacts

doctors_schedules

doctors_specialties

Результат

Комментарии:

1. То, что вы просите (один ко многим, многие ко многим и т. Д.), — Это Идеи, основанные на шаблонах проектирования. PHP PDO — это драйвер для подключения к базе данных. Это взаимоисключающие идеи. Если вы хотите показать отношения, вам следует изучить что-то вроде Doctrine или Eloquent

Ответ №1:

Используйте, например, DISTINCT и GROUP_CONCAT, вы можете добавить свой собственный seperatr и упорядочить список

 $sql = "SELECT doctors.name, doctors.floor, doctors.room_no, doctors.clinic_address, 
    GROUP_CONCAT(DISTINCT doctors_schedules.schedule), 
    GROUP_CONCAT(DISTINCT doctors_contacts.contact_number),
    GROUP_CONCAT(DISTINCT doctors_specialties.specialties_id) 
    FROM doctors 
    INNER JOIN doctors_schedules ON doctors.id = doctors_schedules.doctor_id
    INNER JOIN doctors_contacts ON doctors.id = doctors_contacts.doctor_id
    INNER JOIN doctors_specialties ON doctors.id = doctors_specialties.doctor_id  
    GROUP BY doctors.id";

    $stmt = $db->prepare($sql);
    $stmt->execute();
    return $stmt->fetchAll();
  

Комментарии:

1. сэр, я уже пробовал GROUP_CONCAT вчера, но он повторяет значения контактов, расписания и специальностей [GROUP_CONCAT(doctors_specialties.specialties_id)] => 11,10,10,11,9,11,9,10,10,9,11,9 ) это выглядит так, сэр

2. @antonseverino FWIW, мне кажется безумным объединять данные, которые затем будут проанализированы с помощью кода приложения — но что бы ни плыло, ваша лодка.