我正在处理一个查询,我使用左连接从多个表中提取数据,如下所示:
$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/