Инструменты пользователя

Инструменты сайта


limb3:ru:packages:active_record:how_to_extend_collections

Расширение классов коллекций связей вида один-ко-многим и много-ко-многим

Создание и внедрение новых классов коллекций

Необходимость использовать свои собственные классы для коллекций связанных объектов может проявиться, если вам необходимо применять какие-либо особенные правила при выборках объектов или при изменении состояния коллекции.

Базовыми классами для коллекций являются:

  • 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()-методы.

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
   __ __   _  __   ___  __  __   _  __
  / // /  / |/ /  / _ \ \ \/ /  | |/_/
 / _  /  /    /  / // /  \  /  _>  <  
/_//_/  /_/|_/  /____/   /_/  /_/|_|
 
limb3/ru/packages/active_record/how_to_extend_collections.txt · Последние изменения: 2010/11/10 10:02 (внешнее изменение)