====== Расширение классов коллекций связей вида один-ко-многим и много-ко-многим ====== ===== Создание и внедрение новых классов коллекций ===== Необходимость использовать свои собственные классы для коллекций связанных объектов может проявиться, если вам необходимо применять какие-либо особенные правила при выборках объектов или при изменении состояния коллекции. Базовыми классами для коллекций являются: * **lmbAROneToManyCollection** - для коллекций связей один-ко-многим. * **lmbARManyToManyCollection** - для коллекция связей много-ко-многим. Для внедрения новой коллекции используется параметр **collection** при описании связи, например: class Course extends lmbActiveRecord { protected $_has_many = array('lectures' => array('field' => 'course_id', 'class' => 'Lecture', 'collection' => 'CourseLecturesCollection')); } class Lecture extends lmbActiveRecord { protected $_many_belongs_to = array('course' => array('field' => 'course_id', 'class' => 'Course')); } В примере мы будем использовать %%CourseLecturesCollection%% при работе со списком лекций, которые относятся к курсу. Класс %%CourseLecturesCollection%% может выглядеть следующим образом: class CourseLecturesCollection extends lmbAROneToManyCollection { function add($object) { if($this->_someImportantCondition()) parent :: add($object); else throw new lmbException('This operation is not allowed'); } protected _someImportantCondition() { [...] } } ===== Условное внедрение новых классов коллекций ===== Иногда новый класс нужно внедрять на основе какой-либо логики. Коллекции создаются в методе lmbActiveRecord :: **createRelationCollection($relation, $criteria = null)** В нашей работе мы встречались со случаем, когда необходимо было внедрять декоратор на коллекцию, если объекты в коллекции были определенного класса: function createRelationCollection($relation, $criteria = null) { $collection = parent :: createRelationCollection($relation, $criteria); $relation_info = $this->getRelationInfo($relation); $class = $relation_info['class']; $object = new $class(); if($object instanceof SpecialObject) return new SpecialObjectCollectionDecorator($collection); else return $collection; } ===== Наложение условий на все выборки в коллекции ===== Обратите внимание на второй параметр метода lmbActiveRecord :: createRelationCollection($relation, $criteria = null). Этот параметр позволяет внедрить в коллекцию условие, которое всегда будет накладываться на выборки элементов, помимо тех, что передаются в find()-методы.