2

例子:

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 语句来做我想做的事情的方法,但这对于我的问题来说确实不是一个好的解决方案。

我对此有特定的原因,解决方案将对我的项目大有裨益。虽然我真的不认为有更简单的方法可以做到这一点......

4

3 回答 3

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;
}
于 2013-04-13T18:08:14.920 回答
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] => 
            ...
        )
)

因此您可以使用dbandorgtable字段来确定每个字段来自哪个表。

于 2013-04-13T20:01:42.850 回答
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;
}

这是我所做的一个非常简单的例子。这对我的项目来说是一个很好的解决方案。我在我的项目中使用的代码太复杂了,并且实现了类,我无法在此处发布它。

所以,如果这个例子中有任何语法错误,我很抱歉!

于 2013-04-13T23:22:48.923 回答