Удаление элементов из Doctrine_Collection

При использовании Doctrine 1.2 у меня возникают проблемы с удалением элементов из коллекции Doctrine_Collection.

У меня есть коллекция Doctrine, заполненная временными Doctrine_Records. Функции $record->delete() и $record->unlink() здесь не работают должным образом, поскольку они используют идентификаторы записей. (Каких временных записей нет, поскольку они еще не появляются в базе данных.)

Пример (в которой у компании много сотрудников)

/* Get a Company that has no Employees yet. */
$company = Doctrine::getTable('Company')->find(1);

/* Add some Employees */
$names = array('Arthur','Bob','Charlie');

foreach ($names as $name) 
{
    $employee = new Employee;
    $employee->name = "Arthur"
    $company->Employee->add($employee);
}

Теперь, прежде чем сохранять что-либо в базу данных, у меня есть один сотрудник в $emp, которого я хочу удалить из коллекции.

$emp->delete() /* Does not work when $emp is transient. */

Что действительно работает, так это то, но я действительно сомневаюсь, что это правильный путь.

foreach($company->Employee as $key => $value)
    if ($emp == $value) 
    {
        $company->Employee->remove($key);
        break;
    }

Это не похоже на самый простой способ сделать это. Есть ли более рекомендуемый способ сделать это?


person The Pellmeister    schedule 24.01.2012    source источник


Ответы (1)


В итоге я создал подкласс для Doctrine_Collection и реализовал эту функцию, которая дала мне именно то поведение, которое я хотел.

   /**
    * Looks up a Doctrine_Record in the collection, and - when found - removes it. It is also compatible with serialised records, as 
    * it tries strict matching (using ===) as well as loose matching (using ==). A strict match precedes a loose match.
    */
   public function removeItem($item)
   {
      if (!($item instanceof Doctrine_Record)) 
      {
         throw new Exception("Error while calling removeItem, trying to remove an item that does not descend from Doctrine_Record");
         return;
      }

      foreach ($this as $key=>$value)
      {
         if ($item === $value)
         {
            /* Strict match found, remove it and return. */
            $this->remove($key);
            return;
         }
         if ($looseMatch === null && $item == $value) $looseMatch = $key;
      }

      /* No strict match found. If a $matchLoose is on, and aloose match was found, remove it. */
      if ($looseMatch !== null) 
      {
         $this->remove($looseMatch);
      } 
      else throw new Exception('No match found trying to remove an item from a collection.');

   }
person The Pellmeister    schedule 09.05.2012