【问题标题】:return result object from PHP db query从 PHP db 查询返回结果对象
【发布时间】:2010-12-16 23:33:47
【问题描述】:

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

$查询 = " 选择 用户名, users.email, 街道地址, 地址.city, 地址.状态, 地址.zip 来自用户 左连接( 选择 地址.street, 地址.city, 地址.state, 地址.zip, `addresses.user_id` 发件人地址 ) AS 地址 ON users.id = `address.user_id` WHERE users.id = 1"; $mysql = new mysql(HOST, USER, PASS, DBNAME); $result = $mysql->query($query)->fetch_object();

我现在得到的结果我可以像这样访问结果:

// 获取名字 $结果->名称; //获取街道地址 $结果->街道;

因为查询最终会变得比这更复杂一些。我希望能够像这样访问数据:

// 获取用户名 $结果->用户->名称; // 获取街道地址 $结果->地址->街道;

这将有助于使数据更易于阅读,因为某些表具有类似命名的字段。

任何帮助都会非常感谢。


编辑:(回应史蒂夫)

我熟悉 ORM,目前正在使用 Kohana 框架。我的兴趣是减少实际运行的查询数量。 Kohana 框架中的 ORM 为您调用的每个表/模型调用一个“SELECT *”。如果没有必要,我宁愿不这样做。

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

【问题讨论】:

  • 为什么是子查询?为什么不加入地址?
  • @outis,我不完全确定这能回答我的问题,但你介意举个例子吗?我的 SQl 不是最好的

标签: php


【解决方案1】:

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

好的 PHP ORM 是例如DoctrinePropel

【讨论】:

    【解决方案2】:

    要在评论中回答您的问题,我会设想以下查询:

    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
    

    由于sub-select最多是addresses表的一个投影,看起来是多余的。

    至于主要问题,我很难想出任何优雅且非骇客的东西。事实上,唯一能想到的东西是彻头彻尾的丑陋。例如,您可以为查询中的列名添加前缀:

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

    【讨论】:

    • 那么这个查询是否从地址表中选择了所有内容?我不知道你能做到这一点。谢谢!
    • 它选择每个具有您指定的 user_id 的地址,这与您的查询相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多