我正在进行一个查询,我使用这样的左连接从多个表中提取数据:
$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个单独的表中提取数据,所以我宁愿不运行单独的查询来获取我正在描述的功能
答案 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)