从PHP db查询返回结果对象

时间:2009-11-16 08:15:26

标签: php

我正在进行一个查询,我使用这样的左连接从多个表中提取数据:

 $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框架。我的兴趣是减少实际运行的查询数量。 Kohana框架中的ORM为您调用的每个表/模型调用“SELECT *”。如果我不这样做,我宁愿不这样做。

运行两个单独的查询(如示例中所示)并不是什么大不了的事,但在我的实例中,我将从大约10个单独的表中提取数据,所以我宁愿不运行单独的查询来获取我正在描述的功能

2 个答案:

答案 0 :(得分:4)

要在评论中回答您的问题,这是我想要的查询:

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());

答案 1 :(得分:0)

我认为可能唯一的方法是使用一些ORM(对象关系映射器)。 ORM的使用带来了其他方便的东西,但是你必须为它付出更低的性能。

好的PHP ORM例如是DoctrinePropel