function __call($name, $arguments) { $relationship = Model::getRelationship($this->rowClass, $name); if ($relationship === false && Inflector::isPlural($name)) { $name = Inflector::toSingular($name); $relationship = Model::getRelationship($this->rowClass, $name); if (!$relationship instanceof BelongsToRelationship) { $relationship = false; } } if ($relationship !== false) { return $relationship->selectModelSet($this); } else { throw new RecessException('Relationship "' . $name . '" does not exist.', get_defined_vars()); } }
function __call($name, $arguments) { if (empty($arguments)) { $descriptor = Model::getDescriptor($this->rowClass); $attachedMethod = $descriptor->getAttachedMethod($name); if (!$attachedMethod) { if (Inflector::isPlural($name)) { $attachedMethod = $descriptor->getAttachedMethod(Inflector::toSingular($name)); } } if ($attachedMethod) { $params = $attachedMethod->getParameters(); if (count($params) === 0) { return call_user_func(array($attachedMethod->object, $attachedMethod->method), $this); } } } throw new RecessException('Method "' . $name . '" does not exist on ModelSet nor is attached to ' . $this->rowClass . '.', get_defined_vars()); }
function removeFrom(Model $model, Model $relatedModel) { if (!isset($this->through)) { $foreignKey = $this->foreignKey; $relatedModel->{$foreignKey} = ''; $relatedModel->save(); return $model; } else { $through = new $this->through(); $localPrimaryKey = Model::primaryKeyName($model); $localForeignKey = $this->foreignKey; $through->{$localForeignKey} = $model->{$localPrimaryKey}; $relatedPrimaryKey = Model::primaryKeyName($this->through); $relatedForeignKey = Model::getRelationship($this->through, Inflector::toSingular($this->name))->foreignKey; $through->{$relatedForeignKey} = $relatedModel->{$relatedPrimaryKey}; $through->find()->delete(false); } }
function testToSingular() { $this->assertEquals('thing', Inflector::toSingular('things')); $this->assertEquals('person', Inflector::toSingular('persons')); $this->assertEquals('ox', Inflector::toSingular('oxs')); }