[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запрос к нескольким таблицам БД и вывод результата
Ivan707
Добрый вечер!

Только начинаю изучение ООП PHP и столкнулся с небольшой проблемой.
Есть несколько таблиц Data, Constant, Categorie и один запрос к этим таблицам (для простоты я сократил запрос).

SELECT * FROM `'. data::getTableName() . '`,`' .constant::getTableName().'`,`'. categorie::getTableName().'` WHERE data.b_const=constant.id AND data.id_cat=categorie.id;

Для каждой таблицы, создал три похожих модели со своими полями таблиц.

namespace MyProject\Models\Constants;
use MyProject\Models\ActiveRecordEntity;

class Constant extends ActiveRecordEntity
{
protected $id;
protected $const1;

public function getConst1(): string
{
return $this->const1;
}
protected static function getTableName(): string
{
return 'constant';
}
}


В ActiveRecordEntity находится сам запрос.

Получаю следующий результат var_dump:

0 =>
object(MyProject\Models\Datas\Data)[6]
protected 'proc' => string '200' (length=3)
protected 'bPrim' => string '' (length=0)
....
public 'id' => string '15' (length=2)
public 'idData' => string '2' (length=1)


То есть я могу вывести результат через функции модель Data "getIdData()", а остальное через обращение непосредственно к имени поля таблицы БД оставшихся таблиц.

Подскажите пожалуйста, как правильно реализуются такие запросы в ООП PHP. Вернее как сделать так, чтобы модели узнали друг о друге. Раньше я имел дело только с чистым PHP.
Ivan707
Добрые люди подсказали

В актив рекорд если у тебя 2 сущности data, constant
И они связаны через data.b_const=constant.id

То да, у них у каждого свой класс
Data и Constant

Обычно есть метод у актив рекорда, приватный, для установки связей. Например в Data
class Data
{
...
private function relations(): array
{
return [
Constant::class => ['b_const' => 'id'],
];

}
}

Тогда Data понимает, как она связана с другим классом. А далее когда делается выборка с реляцией, ее объект можно получить через метод или поле
$data->constrant;

Где constrant объект Constant::class

Подскажите пожалуйста, как применить полученные знания на практике.
Мой запрос
SELECT * FROM `'. data::getTableName() . '`,`' .constant::getTableName().'`,`'. categorie::getTableName().'` WHERE data.b_const=constant.id AND data.id_cat=categorie.id;

Получаю результат на странице сейчас
 foreach ($staty as $stat) :
$stat->getProc();
$stat->getConst1(); // Ошибка
endforeach;
brevis
Цитата
Тогда Data понимает, как она связана с другим классом. А далее когда делается выборка с реляцией, ее объект можно получить через метод или поле

Ну так нужно же написать специальный код, который будет позволять это делать. Без него магии не будет.

Ты осознанно разрабатываешь свою ORM (для саморазвития или еще зачем-то)? Или просто случайно где-то повернул не туда? smile.gif

Наверное для начала тебе было бы не плохо посмотреть доки и примеры использования каких-нибудь существующих ORM. Например, Eloquent довольно популярна или что-то там из Yii2. Ну и куча других.

Когда будет понятно, что должно получиться в итоге, тогда можно думать как это сделать.

_____________
Чатик в телеге
Thomas_Bergersen
$sql = "SELECT * FROM `'. data::getTableName() . '`,`' .constant::getTableName().'`,`'. categorie::getTableName().'` WHERE data.b_const=constant.id AND data.id_cat=categorie.id;";
if($result = $conn->query($sql)){
while($row = $result->fetch_array()){

$data.b_const= $row["b_const"];
$constant.id= $row["id"];
$data.id_cat= $row["id_cat"];
$categorie.id= $row["id"];
}
}
В данном случае метод $result->fetch_array() выбирает текущую строку из набора в переменную $row и переходит к следующей. Когда строк не останется, метод возвратит false, и произойдет выход из цикда. Полученное значени $row опять же представляет строку в виде ассоциативного массива.
$result->free();
<!DOCTYPE html>
<html>
<head>
<title>METANIT.COM</title>
<meta charset="utf-8" />
</head>
<body>
<h2>Список пользователей</h2>
<?php
$conn = new mysqli("localhost", "root", "mypassword", "testdb2");
if($conn->connect_error){
die("Ошибка: " . $conn->connect_error);
}
$sql = "SELECT * FROM `'. data::getTableName() . '`,`' .constant::getTableName().'`,`'. categorie::getTableName().'` WHERE data.b_const=constant.id AND data.id_cat=categorie.id;";
if($result = $conn->query($sql)){
$rowsCount = $result->num_rows; // количество полученных строк
echo "<p>Получено объектов: $rowsCount</p>";
echo "<table><tr><th>Id</th><th>Имя</th><th>данные какие та</th></tr>";
foreach($result as $row){
echo "<tr>";
echo "<td>" . $row["b_const"] . "</td>";
echo "<td>" . $row["id"] . "</td>";
echo "<td>" . $row["id_cat"] . "</td>";
echo "<td>" . $row["id"] . "</td>";
echo "</tr>";
}
echo "</table>";
$result->free();
} else{
echo "Ошибка: " . $conn->error;
}
$conn->close();
?>
</body>
</html>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.