выборка одной-многих связанных таблиц, pdo - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть настройка PDO, и она работает без проблем. Я могу добавить , изменить , del et c. Так что проблема здесь. В БД существует отношение one to many, и когда я выбираю родительскую таблицу, я хочу вместе с ней перейти к связанной дочерней таблице.

соединение БД с PDO .

private $server = "localhost";
private $username = "name";
private $password = "password";
private $database = "database_name";

protected function connect(){

    $dns = "mysql:host=" . $this->server . ";dbname=" . $this->database;
    $pdo = new PDO($dns, $this->username, $this->password);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

    return $pdo;
}

класс пользователей

class Users extends Dbc {

    public function get_users(){

        $sql = "SELECT user.id as u_id, 
        user.user as u_name, 
        schedule.id as s_id, 
        schedule.status as s_status, 
        schedule.content as s_content,
        schedule.return_date as s_date,
        schedule.remarks as s_remarks
        FROM users user
        JOIN schedules schedule ON schedule.user_id = u.id";

    $stmt = $pdo->prepare($sql);
    $stmt->execute();

    $data = [];
    while ($row = $stmt->fetch()) {
        $schedules = [
            'id' => $row['s_id'],
            'status' => $row['s_status'],
            'content' => $row['s_content'],
            'date' => $row['s_date'],
            'remarks' => $row['s_remarks'],
        ];
        if (!isset($data[$row['c_id']])) {
            $row['u_id'] = [
                'id' => $row['u_id'],
                'name' => $row['u_name'],
                'schedules' => [$schedules]
            ];
        } else {
            $row['u_id']['schedules'][] = $schedules;
        }

    echo json_encode($data);


    }   

}

это, конечно, возвращает только users таблица, так как правильно выбрать таблицу пользователей с дочерней таблицей в ней. Что мне нужно изменить в PDO ...

1 Ответ

0 голосов
/ 08 апреля 2020

В PDO нечего менять. Вам просто нужно изменить свой SQL и способ его обработки. Это объясняется в моей статье о выборке один ко многим с PDO , но вкратце, вам нужно написать запрос, который использует JOIN для выборки записей из дочерней таблицы, а затем добавить условие в выборку l oop чтобы избежать повторений в результирующем массиве.

Пример взят из моей статьи, так как вы не предоставили никакой информации о ваших таблицах:

$sql = "SELECT c.id as c_id, c.name as c_name, c.url, 
               p.id as p_id, p.name as p_name, p.price
        FROM category c
        JOIN product p ON p.category_id=c.id
        ORDER BY c.name, p.name
        LIMIT ?,?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$start, $limit]);

$data = [];
while ($row = $stmt->fetch()) {
    $product = [
        'id' => $row['p_id'],
        'name' => $row['p_name'],
        'price' => $row['price'],
    ];
    if (!isset($data[$row['c_id']])) {
        $row['c_id'] = [
            'name' => $row['c_name'],
            'url' => $row['url'],
            'products' => [$product]
        ];
    } else {
        $row['c_id']['products'][] = $product;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...