Проблема доктрины - разные запросы, те же результаты, но не с доктриной - PullRequest
0 голосов
/ 19 марта 2010

У меня небольшая проблема с доктриной, использующей Symfony 1.4 (я думаю, что она использует доктрину 1.2). У меня есть 2 запроса, используя raw sql в консоли mysql, они выдают одинаковый набор результатов. Запросы могут быть сгенерированы с использованием этого кода:

    $dates = Doctrine::getTable('Picture')
              ->createQuery('a')
              ->select('substr(a.created_at,1,10) as date')
              ->leftjoin('a.PictureTag pt ON a.id = pt.picture_id')
              ->leftjoin('pt.Tag t ON t.id = pt.tag_id')
              ->where('a.created_at <= ?', date('Y-m-d 23:59:59'))
              ->orderBy('date DESC')
              ->groupby('date')
              ->limit(ITEMS_PER_PAGE)
              ->offset(ITEMS_PER_PAGE * $this->page)
              ->execute();

Если я удаляю два соединения, это меняет запрос, но набор результатов тот же. Но используя doctrine execute (), вы получите только одну строку.

Кто-нибудь имеет представление о том, что здесь происходит?

PS: таблица изображений содержит идентификатор, заголовок, файл, create_at (формат 'Ymd h: i: s'), таблица тегов - это идентификатор, имя, а PictureTag - таблица отношений с идентификатором и двумя внешними ключами. *

PS 2: Вот два SQL-запроса (первый без объединений)

SELECT substr(l.created_at, 1, 10) AS l__0 FROM lupa_picture l WHERE (l.created_at <= '2010-03-19 23:59:59') GROUP BY l__0 ORDER BY l__0 DESC LIMIT 4

 SELECT substr(l.created_at, 1, 10) AS l__0 FROM lupa_picture l LEFT JOIN lupa_picture_tag l2 ON (l.id = l2.picture_id) LEFT JOIN lupa_tag l3 ON (l3.id = l2.tag_id) WHERE (l.created_at <= '2010-03-19 23:59:59') GROUP BY l__0 ORDER BY l__0 DESC LIMIT 4

Ответы [ 2 ]

1 голос
/ 19 марта 2010

У меня было что-то похожее на этой неделе. SQL, сгенерированный Doctrine (из панели отладки Symfony), работал нормально в phpMyAdmin, но не выполнялся при выполнении запроса, как в вашем вопросе. Попробуйте добавить в свой запрос следующее:

->setHydrationMode(Doctrine::HYDRATE_SCALAR)

и посмотрите, даст ли он ожидаемый результат. Если это так, то до коллекции Doctrine_Collection используется первичный ключ Picture в качестве индекса в коллекции. Если у вас есть более 1 результата с одним и тем же индексом, Doctrine откажется добавить его в коллекцию, поэтому вы получите только 1 результат. Я закончил тем, что запустил запрос, используя другую таблицу, а не ту, которую хотел, что привело к уникальному первичному ключу, после чего появились требуемые результаты.

0 голосов
/ 22 марта 2010

Ну, решение было в том, что ... кроме substr (), ему нужен еще один столбец таблицы. Использование select (substr (), a.created_at) заставило его работать

...