php - 从 PHP 数据库查询返回结果对象

标签 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 个单独的表中提取数据,因此我不想运行单独的查询来获取我所描述的功能

最佳答案

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

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

关于php - 从 PHP 数据库查询返回结果对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1740788/

相关文章:

php - 如何打印 4 位数字?

php - 使用 PHP 将数据插入两个单独的表

php - 从 html 重定向到 php

php - 如何使用 phpmailer 隐藏发件人电子邮件地址?

javascript - 将一系列 JSON 数据从 php 回显到 JavaScript,

php - Symfony2 在每个循环中更改元素样式

php - URL 重写为私密访问文件

php - PHP 中 array_replace 和 array_merge 的区别

php - 执行触发器时出现 SQL DELIMITER 错误

php - 在 AJAX 页面中获取数据