@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
  • Вопрос задан
  • 167 просмотров
Пригласить эксперта
Ответы на вопрос 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, включая название категории для каждого материала.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы