Оператор доктрины select всегда возвращает все поля таблицы

У меня есть следующая таблица

Test:
    tableName: test
    columns:
        test_id:
            name: test_id as id
            primary: true
            autoincrement: true
            type: integer
            notnull: true
        test_name:
            name: test_name as name
            type: string(255)
        test_title:
            name: test_title as title
            type: string(255)

и этот оператор dql

$dql = Doctrine_Query::create()->select('t.name')->from('Model_Test t');

сгенерирован следующий sql ist

SELECT t.test_id AS t__test_id, t.test_name AS t__test_name FROM test t

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

foreach ($results as $result) {
    foreach ($result as $filed => $value) {
        echo "$filed => $value <hr>"; // echoes 'title' => null but title in db has other value
    }                                
}                                

также дамп через Zend_Debug::dump($results->toArray()); показывает мне все поля, как если бы я сделал выбор *

Итак, как ограничить возвращаемые поля, чтобы они соответствовали моему выбору?

заранее спасибо

Мартин


person Martin    schedule 22.11.2010    source источник
comment
Вы когда-нибудь находили решение для этого? Я также борюсь с этим. Я не хочу передавать ненужный мусор как json для потребителей ajax.   -  person Attila Fulop    schedule 01.04.2012
comment
Неважно, -›setHydrationMode(Doctrine::HYDRATE_ARRAY) решил эту проблему.   -  person Attila Fulop    schedule 01.04.2012


Ответы (3)


Наверное:

потому что

$results = $dql->execute();

извлекает результат как объект, невыбранные переменные заполняются нулями

в то время как

$results = $dql->fetchArray(); 

извлекает массив, и в этом случае отображаются только выбранные поля (помимо первичного ключа)

person Martin    schedule 23.11.2010
comment
Это имело значение для меня. Вы также можете передать параметр Doctrine_Core::HYDRATE_ARRAY в качестве второго параметра в execute или fetchOne, и вы получите тот же результат, что и fetchArray. - person Matt Huggins; 23.01.2011

Это работает для меня и извлекает только запрошенные поля:

$events = Doctrine_Query::create()
     ->select("e.id, e.Title, e.Lat, e.Lon, e.Startdate, e.Location, e.Url")
     ->from('Event e')
     ->setHydrationMode(Doctrine::HYDRATE_ARRAY)
     ->execute();

Результирующий массив будет содержать только выбранные поля

person Attila Fulop    schedule 01.04.2012

Я не уверен, но я думаю, что доктрина выбирает только id и name, но когда вы пытаетесь получить доступ к title, она видит, что title не извлекается из БД. Таким образом, доктрина повторно выбирает этот объект (только на этот раз, используя SELECT * или аналогичный запрос).

Если у вас есть какой-нибудь профилировщик запросов Doctrine, вы, вероятно, сможете увидеть все дополнительные запросы, необходимые в цикле foreach.

Просто дикий квест, между прочим...

О, вы можете использовать $query->execute(Doctrine::HYDRATE_ARRAY), если хотите выбрать только часть полей.

person petraszd    schedule 22.11.2010
comment
да и нет: доктрина извлекает все поля, но только выбранные поля имеют значение (заголовок отображается как нуль, даже если он имеет другое значение в таблице). Это сбивает с толку: если запрос находится в библиотеке, пользователь, использующий библиотеку, не имеет представления о запросе. Он не знает, что делать, если заголовок имеет значение null, потому что он не выбран, или если заголовок имеет значение null в базе данных. Я ищу способ перебирать выбранные поля только по выбранным полям... - person Martin; 22.11.2010