/** * Add an item to this many_many relationship * Does so by adding an entry to the joinTable. * @param $extraFields A map of additional columns to insert into the joinTable */ public function add($item, $extraFields = null) { if (is_numeric($item)) { $itemID = $item; } else { if ($item instanceof $this->dataClass) { $itemID = $item->ID; } else { throw new InvalidArgumentException("ManyManyList::add() expecting a {$this->dataClass} object, or ID value", E_USER_ERROR); } } // Validate foreignID if (!$this->foreignID) { throw new Exception("ManyManyList::add() can't be called until a foreign ID is set", E_USER_WARNING); } if ($filter = $this->foreignIDFilter()) { $query = new SQLQuery("*", array("\"{$this->joinTable}\"")); $query->setWhere($filter); $hasExisting = $query->count() > 0; } else { $hasExisting = false; } // Insert or update foreach ((array) $this->foreignID as $foreignID) { $manipulation = array(); if ($hasExisting) { $manipulation[$this->joinTable]['command'] = 'update'; $manipulation[$this->joinTable]['where'] = "\"{$this->joinTable}\".\"{$this->foreignKey}\" = " . "'" . Convert::raw2sql($foreignID) . "'" . " AND \"{$this->localKey}\" = {$itemID}"; } else { $manipulation[$this->joinTable]['command'] = 'insert'; } if ($extraFields) { foreach ($extraFields as $k => $v) { if (is_null($v)) { $manipulation[$this->joinTable]['fields'][$k] = 'NULL'; } else { $manipulation[$this->joinTable]['fields'][$k] = "'" . Convert::raw2sql($v) . "'"; } } } $manipulation[$this->joinTable]['fields'][$this->localKey] = $itemID; $manipulation[$this->joinTable]['fields'][$this->foreignKey] = $foreignID; DB::manipulate($manipulation); } }
/** * Instantiate the appropriate link mappings, making sure they are not referencing the current live URL. */ protected function checkAndCreateMappings() { $livePages = SiteTree::get()->map()->toArray(); foreach ($this->linkMappings as $URL => $siteTreeID) { // Check that the destination site tree element is live. if (isset($livePages[$siteTreeID])) { // Check that the URL is not the current live URL. $query = new SQLQuery('ID', $this->replayTable, "FullURL = '{$URL}'"); if ($query->count('ID') == 0) { echo "<div>{$siteTreeID} - {$URL}</div><br>"; if ($this->live) { singleton('MisdirectionService')->createPageMapping($URL, $siteTreeID); } } } } }
/** * Add an item to this many_many relationship * Does so by adding an entry to the joinTable. * * @param mixed $item * @param array $extraFields A map of additional columns to insert into the joinTable. * Column names should be ANSI quoted. */ public function add($item, $extraFields = array()) { // Ensure nulls or empty strings are correctly treated as empty arrays if (empty($extraFields)) { $extraFields = array(); } // Determine ID of new record if (is_numeric($item)) { $itemID = $item; } elseif ($item instanceof $this->dataClass) { $itemID = $item->ID; } else { throw new InvalidArgumentException("ManyManyList::add() expecting a {$this->dataClass} object, or ID value", E_USER_ERROR); } // Validate foreignID $foreignIDs = $this->getForeignID(); if (empty($foreignIDs)) { throw new Exception("ManyManyList::add() can't be called until a foreign ID is set", E_USER_WARNING); } // Apply this item to each given foreign ID record if (!is_array($foreignIDs)) { $foreignIDs = array($foreignIDs); } foreach ($foreignIDs as $foreignID) { // Check for existing records for this item if ($foreignFilter = $this->foreignIDWriteFilter($foreignID)) { // With the current query, simply add the foreign and local conditions // The query can be a bit odd, especially if custom relation classes // don't join expected tables (@see Member_GroupSet for example). $query = new SQLQuery("*", "\"{$this->joinTable}\""); $query->addWhere($foreignFilter); $query->addWhere(array("\"{$this->joinTable}\".\"{$this->localKey}\"" => $itemID)); $hasExisting = $query->count() > 0; } else { $hasExisting = false; } // Blank manipulation $manipulation = array($this->joinTable => array('command' => $hasExisting ? 'update' : 'insert', 'fields' => array())); if ($hasExisting) { $manipulation[$this->joinTable]['where'] = array("\"{$this->joinTable}\".\"{$this->foreignKey}\"" => $foreignID, "\"{$this->joinTable}\".\"{$this->localKey}\"" => $itemID); } if ($extraFields && $this->extraFields) { // Write extra field to manipluation in the same way // that DataObject::prepareManipulationTable writes fields foreach ($this->extraFields as $fieldName => $fieldSpec) { // Skip fields without an assignment if (array_key_exists($fieldName, $extraFields)) { $fieldObject = Object::create_from_string($fieldSpec, $fieldName); $fieldObject->setValue($extraFields[$fieldName]); $fieldObject->writeToManipulation($manipulation[$this->joinTable]); } } } $manipulation[$this->joinTable]['fields'][$this->localKey] = $itemID; $manipulation[$this->joinTable]['fields'][$this->foreignKey] = $foreignID; DB::manipulate($manipulation); } }
/** * Add an item to this many_many relationship. Does so by adding an entry * to the joinTable. * * @param mixed $item * @param array $extraFields A map of additional columns to insert into the * joinTable */ public function add($item, $extraFields = null) { if (is_numeric($item)) { $itemID = $item; } else { if ($item instanceof $this->dataClass) { $itemID = $item->ID; } else { throw new InvalidArgumentException("ManyManyList::add() expecting a {$this->dataClass} object, or ID value", E_USER_ERROR); } } $foreignIDs = $this->getForeignID(); $foreignFilter = $this->foreignIDWriteFilter(); // Validate foreignID if (!$foreignIDs) { throw new Exception("ManyManyList::add() can't be called until a foreign ID is set", E_USER_WARNING); } if ($foreignFilter) { $query = new SQLQuery("*", array("\"{$this->joinTable}\"")); $query->setWhere($foreignFilter); $hasExisting = $query->count() > 0; } else { $hasExisting = false; } // Insert or update foreach ((array) $foreignIDs as $foreignID) { $manipulation = array(); if ($hasExisting) { $manipulation[$this->joinTable]['command'] = 'update'; $manipulation[$this->joinTable]['where'] = "\"{$this->joinTable}\".\"{$this->foreignKey}\" = " . "'" . Convert::raw2sql($foreignID) . "'" . " AND \"{$this->localKey}\" = {$itemID}"; } else { $manipulation[$this->joinTable]['command'] = 'insert'; } if ($extraFields) { foreach ($extraFields as $k => $v) { if (is_null($v)) { $manipulation[$this->joinTable]['fields'][$k] = 'NULL'; } else { if (is_object($v) && $v instanceof DBField) { // rely on writeToManipulation to manage the changes // required for this field. $working = array('fields' => array()); // create a new instance of the field so we can // modify the field name to the correct version. $field = DBField::create_field(get_class($v), $v); $field->setName($k); $field->writeToManipulation($working); foreach ($working['fields'] as $extraK => $extraV) { $manipulation[$this->joinTable]['fields'][$extraK] = $extraV; } } else { $manipulation[$this->joinTable]['fields'][$k] = "'" . Convert::raw2sql($v) . "'"; } } } } $manipulation[$this->joinTable]['fields'][$this->localKey] = $itemID; $manipulation[$this->joinTable]['fields'][$this->foreignKey] = $foreignID; DB::manipulate($manipulation); } }