/** * * Find a record XOR create a new record of this model * @param array $data. Should not contain data within the subarray of the mode. * @param array $findFields. Optional. If empty, we will simply use the data itself as the conditions * @return array Either the found or newly created Model data */ public function findXORCreate(Model $model, $data = array(), $findFields = array()) { $suppliedData = array(); if (isset($data[$model->alias])) { $suppliedData = $data[$model->alias]; } else { $suppliedData = $data; } $conditions = array(); if (empty($findFields)) { $conditions = $suppliedData; } else { foreach ($findFields as $field) { if (array_key_exists($field, $suppliedData)) { $conditions[$field] = $suppliedData[$field]; } else { $conditions[$field] = null; } } } if (!$model->Behaviors->enabled('UtilityBehaviors.ValidateFields')) { $model->Behaviors->load('UtilityBehaviors.ValidateFields'); } $validFindFields = $model->validateFields(array_keys($conditions), array('return' => 'valid')); foreach ($conditions as $field => $value) { if (!in_array($field, $validFindFields)) { unset($conditions[$field]); } } $found = $model->find('first', array('conditions' => $conditions)); if ($found) { return $found; } else { $model->create(); $created = $model->save($suppliedData); return $created; } }