示例:
SELECT chapter.id, book.title, book.author FROM chapter
INNER JOIN book ON (chapter.book = book.id)
获取该查询后,我想得到这样的结果:
Array
(
[0] => Array
(
[chapter] => Array
(
[id] => 1
)
[book] => Array
(
[title] => Lorem Ipsum
[author] => John Doe
)
)
)
更好的是, stdClass 对象。
好吧,经过一段时间的搜索和工作,我找到了一种通过php-sql-parser解析SQL语句来实现我想要的方法,但这对我的问题来说真的不是一个好的解决方案。
我有具体的理由,解决方案对我的项目来说是一个很大的好处。虽然我真的不认为有一种更简单的方法可以做到这一点......
答案 0 :(得分:1)
一种方法是命名(别名)结果集的列,以便PHP代码知道在哪里“归档”它们,例如:将表和列拆分为:
:
SELECT chapter.id as `chapter:id`, book.title as `book:title`, book.author as `book:author` ...
然后,当从PDO / mysqli检索结果时,您可以拆分生成的密钥以了解数据的存储位置:
$formatted_row = array();
foreach ( $db_row as $column_alias => $value )
{
list($table, $column) = explode(':', $column_alias);
$formatted_row[$table][$column] = $value;
}
答案 1 :(得分:1)
fetch_fields()
功能将为您提供所需的信息。脚本
<?php
$sql = "
SELECT u.user, h.db, RAND() x FROM mysql.user u
LEFT JOIN mysql.host h ON h.host = u.host
";
$conn = new mysqli('localhost', 'root', '', 'mysql');
$stmt = $conn->query($sql);
$fields = $stmt->fetch_fields();
print_r($fields);
产生以下输出:
Array(
[0] => stdClass Object(
[name] => user
[orgname] => User
[table] => u
[orgtable] => user
[def] =>
[db] => mysql
...
)
[1] => stdClass Object(
[name] => db
[orgname] => Db
[table] => h
[orgtable] => host
[def] =>
[db] => mysql
...
)
[2] => stdClass Object(
[name] => x
[orgname] =>
[table] =>
[orgtable] =>
[def] =>
[db] =>
...
)
)
因此您可以使用db
和orgtable
字段来确定每个字段来自哪个表格。
答案 2 :(得分:0)
$query = $myPdoInstance->prepare('SELECT lorem FROM ipsum...');
$metaData = array();
$data = new stdClass;
$i = 0;
$tablesIdField = 'id';
$query->execute();
while ($columnsMeta = $query->getColumnMeta($i++)) {
$metaData[] = $columnsMeta;
}
foreach ($query->fetch(PDO::FETCH_NUM) as $key => $columnValue) {
$currentTable = $meta[$key]['table'];
if (!isset($data->{$currentTable})) {
$data->{$currentTable} = new stdClass;
} elseif (!is_object($data->{$currentTable})) {
$prev = $data->{$currentTable};
$data->{$currentTable} = new stdClass;
$data->{$currentTable}->{$tablesIdField} = $prev;
}
$data->{$currentTable}->{$meta[$key]['name']} = $columnValue;
}
这是我所做的非常简单的示例。这对我的项目来说是一个很好的解决方案 我在我的项目中使用的代码太复杂了,我实现了类在这里发布。
所以,如果这个例子中有任何语法错误,我很抱歉!