вернуть объект результата из запроса PHP db - PullRequest
2 голосов
/ 16 ноября 2009

Я работаю над запросом, в котором я извлекаю данные из нескольких таблиц, используя левые соединения, например:

 $query = "
     SELECT 
         users.name, 
         users.email,
         address.street,
         address.city,
         address.state,
         address.zip
    FROM users    
LEFT JOIN(
        SELECT 
            addresses.street, 
            addresses.city, 
            addresses.state, 
            addresses.zip, 
            `addresses.user_id `
        FROM addresses
)
AS address
ON users.id = `address.user_id`
WHERE users.id = 1";

$mysql = new mysql(HOST, USER, PASS, DBNAME);
$result = $mysql->query($query)->fetch_object();

Результаты, которые я получаю сейчас, я могу получить доступ к таким результатам:

   // get name
   $result->name;
   //get street address
   $result->street;

Поскольку запрос со временем станет чем-то более сложным, чем этот. Я хотел бы иметь возможность доступа к данным, как это:

// get user name
$result->user->name;

// get the street address
$result->address->street;

Это поможет упростить чтение данных, поскольку некоторые таблицы имеют поля с одинаковыми именами.

Любая помощь будет большой благодарностью. <ч /> РЕДАКТИРОВАТЬ: (в ответ на Стив)

Я знаком с ORM, и в настоящее время я использую фреймворк Kohana. Я заинтересован в том, чтобы сократить количество выполняемых запросов. ORM в структуре Kohana вызывает «SELECT *» для каждой таблицы / модели, которую вы вызываете. Я бы предпочел не делать этого, если мне не нужно.

Выполнение двух отдельных запросов (как показано в примере) не такая уж большая проблема, но в моем реальном примере я собираю данные из примерно 10 отдельных таблиц, поэтому я бы не хотел запускать отдельные запросы функциональность, которую я описывал

Ответы [ 2 ]

4 голосов
/ 16 ноября 2009

Чтобы ответить на ваш вопрос в комментарии, вот запрос, который я хотел бы представить:

SELECT 
     users.name, users.email,
     addresses.street, addresses.city, addresses.state, addresses.zip
  FROM users    
  LEFT JOIN addresses
    ON users.id = addresses.user_id
  WHERE users.id = 1

Поскольку суб-выбор является не более чем проекцией таблицы адресов, он кажется избыточным.

Что касается основного вопроса, мне трудно придумать что-нибудь элегантное и не хакерское. На самом деле, единственное, что приходит на ум, - это ужасно. Например, вы можете добавить префиксы к именам столбцов в запросе:

SELECT 
     users.name AS user_name, users.email AS user_email,
     addresses.street AS address_street, ...

Вы должны разобрать имена столбцов самостоятельно. Я полагаю, это не так уж плохо. Что-то вроде:

function rowToObject($row) {
    $obj = new StdClass();
    foreach ($row as $key => $val) {
        $keys = explode('_', $key);
        $o = $obj;
        for ($i=0; count($keys) > 1; ++$i) {
          $k = array_shift($keys);              
          if (! isset($o->{$k})) {
            $o->{$k} = new StdClass();
          }
          $o = $o->{$k};
        }
        $o->{$keys[0]} = $val;
    }
    return $obj;
}

...
$result = rowToObject($mysql->query($query)->fetch_assoc());
0 голосов
/ 16 ноября 2009

Я думаю, что, возможно, единственный способ - использовать ORM (Object Relational Mapper). Использование ORM приносит другие полезные вещи, кроме этого, но вы должны платить за него, но с более низкой производительностью.

Хорошие PHP ORM, например, Доктрина или Двигатель .

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