Удаление элементов из коллекции Doctrine_Collection - PullRequest
0 голосов
/ 24 января 2012

При использовании 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;
    }

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

1 Ответ

3 голосов
/ 09 мая 2012

В итоге я создал подкласс для 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.');

   }
...