Оператор выбора doctrine всегда возвращает все поля таблицы - PullRequest
3 голосов
/ 22 ноября 2010

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

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 ()); показывает все поля, как если бы я сделал выбор *

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

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

Martin

Ответы [ 3 ]

3 голосов
/ 23 ноября 2010

Я думаю:

, потому что

$results = $dql->execute();

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

, тогда как

$results = $dql->fetchArray(); 

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

1 голос
/ 01 апреля 2012

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

$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();

Полученный массив будет содержать только выбранные поля

0 голосов
/ 22 ноября 2010

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

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

Кстати, просто дикий кесс ...

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

...