Почему мои доктринальные запросы с внутренними объединениями возвращают многомерные массивы? - PullRequest
1 голос
/ 25 февраля 2012

Я использую Doctrine 1.2 в рамках Zend для выполнения запросов к моей базе данных.У меня есть две таблицы, которые я запрашиваю, используя внутреннее соединение, например:

$q = Doctrine_Query::create()
    ->from('My_Model_MaterialsFromDb g')
    ->innerJoin('t.My_Model_TeachingMaterials t');
    ->where('g.id= ?', $id)
$result = $q->fetchArray();

В основном, первая таблица (materialsFromDb) содержит список всех учебных материалов, которые я использую для урока.Второй (trainingMaterials) содержит подробную информацию о самих материалах.

Когда я запускаю этот запрос, вот как неизменно выглядит результат:

Array
(
[0] => Array
    (
        [id] => 1
        [activityId] => 1
        [materialId] => 2
        [My_Model_Materials] => Array
            (
                [id] => 2
                [title] => My Groovy Material
                [materialType] => Worksheet
                [description] => This is my groovy material. It looks really cool.
                [filename] => Groovy Material.doc
                [uploaderId] => 1
                [uploadDate] => 2012-02-16
            )

    )
)

Есть ли способ, которым я могу выполнитьзапрос доктрины, чтобы "сгладить" это в один массив?Результат выглядит так, потому что обе таблицы имеют первичный ключ с именем "id"?Иметь этот многомерный массив в качестве моего результата - настоящая боль, если не сказать больше.

1 Ответ

3 голосов
/ 25 февраля 2012

в соответствии с доктриной 1.2, это именно то, что должно было произойти.

Doctrine hydration removes all duplicated data. It also performs many other things such as:

Custom indexing of result set elements
Value casting and preparation
Value assignment listening
Makes multi-dimensional array out of the two-dimensional result set array, the number of dimensions is equal to the number of nested joins
Now consider the DQL equivalent of the SQL query we used:

// test.php

// ...


 $q = Doctrine_Query::create()
        ->select('u.id, u.username, p.phonenumber')
        ->from('User u')
        ->leftJoin('u.Phonenumbers p');

    $results = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY);

    print_r($results);
The structure of this hydrated array would look like:

$ php test.php
Array
(
    [0] => Array
        (
            [id] => 1
            [username] =>
            [Phonenumbers] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [phonenumber] => 123 123
                        )

                    [1] => Array
                        (
                            [id] => 2
                            [phonenumber] => 456 123
                        )

                    [2] => Array
                        (
                            [id] => 3
                            [phonenumber] => 123 777
                        )

                )

        )
    // ...
)

попробовать ...

$result = $q->execute(array(), Doctrine_Core::HYDRATE_NONE);

или ...

$result = $q->execute(array(), Doctrine_Core::HYDRATE_SCALAR);

этот должен вернуть что-то вроде

$user = array(
    'u_username' => 'jwage',
    'u_password' => 'changeme',
    // ...
);
...