/**
  * update foreign key values
  * 
  * @param string $_mode create|update
  * @param Tinebase_Record_Interface $_record
  */
 protected function _updateForeignKeys($_mode, Tinebase_Record_Interface $_record)
 {
     if (!empty($this->_foreignTables)) {
         foreach ($this->_foreignTables as $modelName => $join) {
             if (!(isset($join['field']) || array_key_exists('field', $join))) {
                 continue;
             }
             $idsToAdd = array();
             $idsToRemove = array();
             if (!empty($_record->{$modelName})) {
                 $idsToAdd = Tinebase_Record_RecordSet::getIdsFromMixed($_record->{$modelName});
             }
             $transactionId = Tinebase_TransactionManager::getInstance()->startTransaction(Tinebase_Core::getDb());
             if ($_mode == 'update') {
                 $select = $this->_db->select();
                 $select->from(array($join['table'] => $this->_tablePrefix . $join['table']), array($join['field']))->where($this->_db->quoteIdentifier($join['table'] . '.' . $join['joinOn']) . ' = ?', $_record->getId());
                 Tinebase_Backend_Sql_Abstract::traitGroup($select);
                 $stmt = $this->_db->query($select);
                 $currentIds = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
                 $stmt->closeCursor();
                 $idsToRemove = array_diff($currentIds, $idsToAdd);
                 $idsToAdd = array_diff($idsToAdd, $currentIds);
             }
             if (!empty($idsToRemove)) {
                 $where = '(' . $this->_db->quoteInto($this->_db->quoteIdentifier($this->_tablePrefix . $join['table'] . '.' . $join['joinOn']) . ' = ?', $_record->getId()) . ' AND ' . $this->_db->quoteInto($this->_db->quoteIdentifier($this->_tablePrefix . $join['table'] . '.' . $join['field']) . ' IN (?)', $idsToRemove) . ')';
                 $this->_db->delete($this->_tablePrefix . $join['table'], $where);
             }
             foreach ($idsToAdd as $id) {
                 $recordArray = array($join['joinOn'] => $_record->getId(), $join['field'] => $id);
                 $this->_db->insert($this->_tablePrefix . $join['table'], $recordArray);
             }
             Tinebase_TransactionManager::getInstance()->commitTransaction($transactionId);
         }
     }
 }
 /**
  * remove members from list
  * 
  * @param  mixed  $_listId
  * @param  mixed  $_membersToRemove
  * @return Addressbook_Model_List
  */
 public function removeListMember($_listId, $_membersToRemove)
 {
     /** @var Addressbook_Model_List $list */
     $list = $this->get($_listId);
     if (empty($_membersToRemove)) {
         return $list;
     }
     $removeMembers = Tinebase_Record_RecordSet::getIdsFromMixed($_membersToRemove);
     $idsToRemove = array_intersect($list->members, $removeMembers);
     $listId = Tinebase_Record_Abstract::convertId($_listId, $this->_modelName);
     $transactionId = Tinebase_TransactionManager::getInstance()->startTransaction(Tinebase_Core::getDb());
     if (!empty($idsToRemove)) {
         $where = '(' . $this->_db->quoteInto($this->_db->quoteIdentifier($this->_tablePrefix . $this->_foreignTables['members']['table'] . '.' . $this->_foreignTables['members']['joinOn']) . ' = ?', $listId) . ' AND ' . $this->_db->quoteInto($this->_db->quoteIdentifier($this->_tablePrefix . $this->_foreignTables['members']['table'] . '.' . $this->_foreignTables['members']['field']) . ' IN (?)', $idsToRemove) . ')';
         $this->_db->delete($this->_tablePrefix . $this->_foreignTables['members']['table'], $where);
     }
     Tinebase_TransactionManager::getInstance()->commitTransaction($transactionId);
     return $this->get($_listId);
 }
 /**
  * remove members from list
  *
  * @param  mixed $_listId
  * @param  mixed $_removeMembers
  * @param  boolean $_removeFromGroup
  * @return Addressbook_Model_List
  */
 public function removeListMember($_listId, $_removeMembers, $_removeFromGroup = true)
 {
     $list = $this->get($_listId);
     $this->_checkGrant($list, 'update', TRUE, 'No permission to remove list member.');
     $this->_checkGroupGrant($list, TRUE, 'No permission to remove list member.');
     $list = $this->_backend->removeListMember($_listId, $_removeMembers);
     if (true === $_removeFromGroup && !empty($list->group_id)) {
         foreach (Tinebase_Record_RecordSet::getIdsFromMixed($_removeMembers) as $userId) {
             Admin_Controller_Group::getInstance()->removeGroupMember($list->group_id, $userId, false);
         }
     }
     return $this->get($list->getId());
 }