Русские документы
Ежедневные компьютерные новости RSS rusdoc.ru  Найти :
• Новости
• Последние поступления
• Книжный магазин
  Hardware:
• Видеоустройства
• Системные платы
• Процессоры
• Мобильные устройства
• Аудиосистема
• Охлаждение системы
• Накопители информации
• КПК и ноутбуки
• Телефоны и связь
• Периферия
• Система
• Сети
• Разные устройства
 
  Programming:
• Web-разработка
• Языки программирования
• Технологии и теория
• Разработка игр
• Программная инженерия
 
  Software:
• Операционные системы
• Windows 7
• Базы данных
• Обзоры программ
• Графика и дизайн
   
  Life:
• Компьютерная жизнь
• Разные материалы
   
• Партнеры
• Публикация
• Правовая информация
• Реклама на сайте
• Обратная связь
• Экспорт в RSS Экспорт в RSS2.0
    Читать в Яндекс.Ленте



Doctrine и сортировка для связи многие к одному

Раздел: Programming / PHP @ 05.09.2009 | Ключевые слова: php sort. doctrine версия для печати

Автор: Дмитрий
Источник: habrahabr

Довольно давно использую связку Zend Framework и Doctrine и очень не хватало сортировки для коллекций получаемых по ссылке. Оказалось, что это легко реализовать.

Позже в одном из проектов, созданном компанией в которой я работаю, был найден подобный метод, но, увы, не ясно просочилось-ли это от разработчиков Doctrine или было создано в недрах моей команды. Смущает тот факт, что найденный фрагмент кода написан для СУБД, которая в нашей компании не используется.

Все манипуляции производились на версии 1.1.3, но должны принести плоды и при использовании более ранних версий Doctrine.

Метод заключается в правке единственного файла. Да, внесение модификаций в код сторонней библиотеки не есть гуд, но, к сожалению, на данный момент другого выхода не видно. Или я плохо искал?

Открываем файл Doctrine/Relation.php и находим место описания массива определений:

protected $definition = array(… );

Добавляем еще одну пару ключ/значение:

`order` => null,

Это необходимо по причине того, что Doctrine именно на базе этого массива составляет список передаваемых в свои классы определений, указанных при формировании связей.

Находим определение функции getRelationDql и добавляем туда код для реализации сортировки. Таким образом функция будет иметь следующий вид:

public function getRelationDql($count)
{
$component = $this->getTable()->getComponentName();

$dql = `FROM ` . $component
. ` WHERE ` . $component . `.` . $this->definition[`foreign`]
. ` IN (` . substr(str_repeat(`?, `, $count), 0, -2) . `)`;

if (!empty($this->definition[`order`]))
{
$dql .= ` ORDER BY ` . $this->definition[`order`];
}

return $dql;
}

Т.е. мы указываем необходимость сортировки в случае, если это определено в описании связи. Именно в этом фрагменте кода ORDER BY может принимать другие формы для разных диалектов SQL.

Осталось в определении связи задать сортировку:

$this->hasMany(`Products`, array(`local`=>`id`,`foreign`=>`category_id`, `order`=>`position desc`));

Таким образом происходит сортировка коллекций для связи многие к одному, что и требовалось получить. Надеюсь, что статья будет кому-то полезна.







версия для печатиРаспечатать статью


Вернуться в раздел: Programming / PHP


Реклама:
Читать наc на:

Add to Google
Читать в Яндекс.Ленте






Rambler's Top100
© Copyright 1998-2012 Александр Томов. All rights reserved.