@Chesterfield25

Как прочитать данные из двух таблиц одновременно?

Как прочитать данные из двух таблиц одновременно в одно методе по условию?
Для примера есть модель материала и метод чтения всех записей и вывод в json формате.

<?php
    class Freeroll {
    
        // подключение к базе данных и таблице "freeroll"
        private $conn;
        private $table_name = "freeroll";
    
        // свойства объекта
        public $category_name;
        public $id;
        public $name_turnament;
        public $prize;
        public $password;
        public $data;
        public $time;
        public $category_id;
        public $buyin;
        public $buyin_symbol;
        public $prize_symbol;
    
        // конструктор для соединения с базой данных
        public function __construct($db){
            $this->conn = $db;
        }
    
        // метод read() - получение товаров
    function read() {
    
        // выбираем все записи
        $query = "SELECT * FROM " . $this->table_name . " ORDER BY id";
    
        // подготовка запроса
        $stmt = $this->conn->prepare($query);
    
        // выполняем запрос
        $stmt->execute();
    
        return $stmt;
    }
    }


Сам метод read.php

<?php
// необходимые HTTP-заголовки
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: GET");

// подключение базы данных и файл, содержащий объекты
include_once "../config/database.php";
include_once "../models/freeroll.php";

// получаем соединение с базой данных
$database = new Database();
$db = $database->getConnection();

// инициализируем объект
$freeroll = new Freeroll($db);
// установим свойство ID записи для чтения
 
// запрашиваем товары
$stmt = $freeroll->read();
$num = $stmt->rowCount();

// проверка, найдено ли больше 0 записей
if ($num>0) {

    // массив товаров
    $freeroll_arr = array();
    $freeroll_arr['status'] = 'ok';
    $freeroll_arr['totalResults'] = $num;
    $freeroll_arr["freeroll"] = array();

    // получаем содержимое нашей таблицы
    // fetch() быстрее, чем fetchAll()
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

        // извлекаем строку
        extract($row);

        $freeroll_item = array(
            "id" => $id,
            "name_turnament" => $name_turnament,
            "prize" => $prize,
            "password" => $password,
            "data" => $data,
            "time" => $time,
            "category_id" => $category_id,
            "buyin" => $buyin,
            "buyin_symbol" => html_entity_decode($buyin_symbol),
            "prize_symbol" => html_entity_decode($prize_symbol)
        
        );

        array_push($freeroll_arr["freeroll"], $freeroll_item);
    }

    // устанавливаем код ответа - 200 OK
    http_response_code(200);

    // выводим данные о товаре в формате JSON
    echo json_encode($freeroll_arr);
} else {

    // установим код ответа - 404 Не найдено
    http_response_code(404);

    // сообщаем пользователю, что товары не найдены
    echo json_encode(array("message" => "Freeroll list not found."), JSON_UNESCAPED_UNICODE);
}


В нем мы получаем public $category_id; это id категории. Как мне получить запись из таблицы категорий по полученному id и вставить её в массив $freeroll_item в месте с записью материала? так же непосредственно есть модель категории category.php и её метод read.php
  • Вопрос задан
  • 109 просмотров
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Ответ написан
Комментировать
ValeriuCutebov
@ValeriuCutebov
Для того чтобы получить данные из двух таблиц, вам необходимо сделать JOIN запрос к базе данных, объединяя таблицу материалов с таблицей категорий. Пример такого запроса может выглядеть так:

SELECT f.*, c.category_name 
FROM freeroll f 
JOIN category c ON f.category_id = c.id 
ORDER BY f.id

В этом запросе мы объединяем таблицы freeroll и category, используя условие ON f.category_id = c.id, и выбираем все столбцы из таблицы freeroll (*) и столбец category_name из таблицы category. Этот запрос вернет результат, который содержит данные из обеих таблиц, а также связанные данные из таблицы category для каждого материала.

Чтобы реализовать этот запрос в методе read() вашей модели Freeroll, вам необходимо изменить запрос в методе read() на:
$query = "SELECT f.*, c.category_name 
          FROM " . $this->table_name . " f 
          JOIN category c ON f.category_id = c.id 
          ORDER BY f.id";

Затем, в цикле while, вы можете добавить значение category_name к массиву $freeroll_item:
$freeroll_item = array(
    "id" => $id,
    "name_turnament" => $name_turnament,
    "prize" => $prize,
    "password" => $password,
    "data" => $data,
    "time" => $time,
    "category_id" => $category_id,
    "category_name" => $category_name,
    "buyin" => $buyin,
    "buyin_symbol" => html_entity_decode($buyin_symbol),
    "prize_symbol" => html_entity_decode($prize_symbol)
);

Здесь мы добавляем значение category_name к массиву $freeroll_item, которое мы получили из таблицы category с помощью JOIN запроса.

Далее, в методе read.php вы можете вызвать метод read() вашей модели Category, чтобы получить все записи из таблицы категорий, и сохранить результаты в массив $category_arr. Это можно сделать следующим образом:
$category = new Category($db);
$category_stmt = $category->read();
$category_num = $category_stmt->rowCount();

$category_arr = array();
while ($category_row = $category_stmt->fetch(PDO::FETCH_ASSOC)) {
    extract($category_row);
    $category_item = array(
        "id" => $id,
        "category_name" => $category_name
    );
    array_push($category_arr, $category_item);
}

Затем, внутри цикла while для каждого материала в $freeroll_arr, вы можете перебрать массив $category_arr, чтобы найти категорию с нужным id, и добавить ее значение к массиву $freeroll_item:
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    extract($row);

    $freeroll_item = array(
        "id" => $id,
        "name_turnament" => $name_turnament,
        "prize" => $prize,
        "password" => $password,
        "data" => $data,
        "time" => $time,
        "category_id" => $category_id,
        "buyin" => $buyin,
        "buyin_symbol" => html_entity_decode($buyin_symbol),
        "prize_symbol" => html_entity_decode($prize_symbol)
);

// Поиск категории с нужным id в массиве $category_arr
foreach ($category_arr as $category_item) {
    if ($category_item['id'] == $category_id) {
        $freeroll_item['category_name'] = $category_item['category_name'];
        break;
    }
}

array_push($freeroll_arr["freeroll"], $freeroll_item);
}

Здесь мы ищем категорию с нужным id в массиве $category_arr, и если находим, добавляем значение category_name к массиву $freeroll_item.

Теперь ваш метод read() будет возвращать все записи из таблицы freeroll, включая название категории для каждого материала.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы