Загрузка ссылочных таблиц в PDO - PullRequest
0 голосов
/ 08 января 2012

У меня есть несколько объектов, которые выглядят так:

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 запроса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...