У меня есть несколько объектов, которые выглядят так:
class A {
#From database
public $id;
public $name;
public $desc;
public $bId;
public $cId;
#In php
public $b; #Points to a B instance
public $c; #Points to a c instance
}
class B {
public $id;
public $name;
public $desc;
}
class C {
public $id;
public $name;
public $desc;
}
Я хотел бы загрузить объект A из таблицы и одновременно загрузить объекты B и C.Один из способов сделать это так:
$a = $db->query("SELECT * FROM table_a WHERE id = $id")->fetchObject(A);
$a->b = $db->query("SELECT * FROM table_b WHERE id = {$a->bId}")->fetchObject(B);
$a->c = $db->query("SELECT * FROM table_c WHERE id = {$a->cId}")->fetchObject(C);
Однако для этого требуется три запроса.Если я хочу получить набор объектов A, он принимает два запроса на элемент.Я могу получить все данные в одном запросе с помощью:
$data = $db->query("
SELECT
table_a.name as `name`,
table_a.desc as `desc`,
table_b.name as `b.name`,
table_b.desc as `b.desc`,
table_c.name as `c.name`,
table_c.desc as `c.desc`,
FROM table_a
LEFT JOIN table_b on table_b.id = table_a.bId
LEFT JOIN table_c on table_c.id = table_a.cId
WHERE table_a.id = $id
")->fetch();
$a = new A();
$a->name = $data['name'];
$a->desc = $data['desc'];
$a->b = new B();
$a->b->name = $data['b.name'];
$a->b->desc = $data['b.desc'];
$a->c = new B();
$a->c->name = $data['c.name'];
$a->c->desc = $data['c.desc'];
Это дает мне только ассоциативный массив, что означает, что мне нужно создавать свои объекты вручную.Кроме того, требуется, чтобы я перечислил все возможные свойства в моем запросе.
Есть ли лучший способ сделать это?Или здесь можно сделать 3 запроса?