http://git-wip-us.apache.org/repos/asf/airavata-php-gateway/blob/80fd786e/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php ---------------------------------------------------------------------- diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php deleted file mode 100755 index 20c2c51..0000000 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php +++ /dev/null @@ -1,3148 +0,0 @@ -<?php namespace Illuminate\Database\Eloquent; - -use DateTime; -use ArrayAccess; -use Carbon\Carbon; -use LogicException; -use JsonSerializable; -use Illuminate\Events\Dispatcher; -use Illuminate\Database\Eloquent\Relations\Pivot; -use Illuminate\Database\Eloquent\Relations\HasOne; -use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Database\Eloquent\Relations\MorphTo; -use Illuminate\Support\Contracts\JsonableInterface; -use Illuminate\Support\Contracts\ArrayableInterface; -use Illuminate\Database\Eloquent\Relations\Relation; -use Illuminate\Database\Eloquent\Relations\MorphOne; -use Illuminate\Database\Eloquent\Relations\MorphMany; -use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Illuminate\Database\Query\Builder as QueryBuilder; -use Illuminate\Database\Eloquent\Relations\MorphToMany; -use Illuminate\Database\Eloquent\Relations\BelongsToMany; -use Illuminate\Database\Eloquent\Relations\HasManyThrough; -use Illuminate\Database\ConnectionResolverInterface as Resolver; - -abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterface, JsonSerializable { - - /** - * The connection name for the model. - * - * @var string - */ - protected $connection; - - /** - * The table associated with the model. - * - * @var string - */ - protected $table; - - /** - * The primary key for the model. - * - * @var string - */ - protected $primaryKey = 'id'; - - /** - * The number of models to return for pagination. - * - * @var int - */ - protected $perPage = 15; - - /** - * Indicates if the IDs are auto-incrementing. - * - * @var bool - */ - public $incrementing = true; - - /** - * Indicates if the model should be timestamped. - * - * @var bool - */ - public $timestamps = true; - - /** - * The model's attributes. - * - * @var array - */ - protected $attributes = array(); - - /** - * The model attribute's original state. - * - * @var array - */ - protected $original = array(); - - /** - * The loaded relationships for the model. - * - * @var array - */ - protected $relations = array(); - - /** - * The attributes that should be hidden for arrays. - * - * @var array - */ - protected $hidden = array(); - - /** - * The attributes that should be visible in arrays. - * - * @var array - */ - protected $visible = array(); - - /** - * The accessors to append to the model's array form. - * - * @var array - */ - protected $appends = array(); - - /** - * The attributes that are mass assignable. - * - * @var array - */ - protected $fillable = array(); - - /** - * The attributes that aren't mass assignable. - * - * @var array - */ - protected $guarded = array('*'); - - /** - * The attributes that should be mutated to dates. - * - * @var array - */ - protected $dates = array(); - - /** - * The relationships that should be touched on save. - * - * @var array - */ - protected $touches = array(); - - /** - * User exposed observable events - * - * @var array - */ - protected $observables = array(); - - /** - * The relations to eager load on every query. - * - * @var array - */ - protected $with = array(); - - /** - * The class name to be used in polymorphic relations. - * - * @var string - */ - protected $morphClass; - - /** - * Indicates if the model exists. - * - * @var bool - */ - public $exists = false; - - /** - * Indicates whether attributes are snake cased on arrays. - * - * @var bool - */ - public static $snakeAttributes = true; - - /** - * The connection resolver instance. - * - * @var \Illuminate\Database\ConnectionResolverInterface - */ - protected static $resolver; - - /** - * The event dispatcher instance. - * - * @var \Illuminate\Events\Dispatcher - */ - protected static $dispatcher; - - /** - * The array of booted models. - * - * @var array - */ - protected static $booted = array(); - - /** - * The array of global scopes on the model. - * - * @var array - */ - protected static $globalScopes = array(); - - /** - * Indicates if all mass assignment is enabled. - * - * @var bool - */ - protected static $unguarded = false; - - /** - * The cache of the mutated attributes for each class. - * - * @var array - */ - protected static $mutatorCache = array(); - - /** - * The many to many relationship methods. - * - * @var array - */ - public static $manyMethods = array('belongsToMany', 'morphToMany', 'morphedByMany'); - - /** - * The name of the "created at" column. - * - * @var string - */ - const CREATED_AT = 'created_at'; - - /** - * The name of the "updated at" column. - * - * @var string - */ - const UPDATED_AT = 'updated_at'; - - /** - * Create a new Eloquent model instance. - * - * @param array $attributes - * @return void - */ - public function __construct(array $attributes = array()) - { - $this->bootIfNotBooted(); - - $this->syncOriginal(); - - $this->fill($attributes); - } - - /** - * Check if the model needs to be booted and if so, do it. - * - * @return void - */ - protected function bootIfNotBooted() - { - $class = get_class($this); - - if ( ! isset(static::$booted[$class])) - { - static::$booted[$class] = true; - - $this->fireModelEvent('booting', false); - - static::boot(); - - $this->fireModelEvent('booted', false); - } - } - - /** - * The "booting" method of the model. - * - * @return void - */ - protected static function boot() - { - $class = get_called_class(); - - static::$mutatorCache[$class] = array(); - - // Here we will extract all of the mutated attributes so that we can quickly - // spin through them after we export models to their array form, which we - // need to be fast. This will let us always know the attributes mutate. - foreach (get_class_methods($class) as $method) - { - if (preg_match('/^get(.+)Attribute$/', $method, $matches)) - { - if (static::$snakeAttributes) $matches[1] = snake_case($matches[1]); - - static::$mutatorCache[$class][] = lcfirst($matches[1]); - } - } - - static::bootTraits(); - } - - /** - * Boot all of the bootable traits on the model. - * - * @return void - */ - protected static function bootTraits() - { - foreach (class_uses_recursive(get_called_class()) as $trait) - { - if (method_exists(get_called_class(), $method = 'boot'.class_basename($trait))) - { - forward_static_call([get_called_class(), $method]); - } - } - } - - /** - * Register a new global scope on the model. - * - * @param \Illuminate\Database\Eloquent\ScopeInterface $scope - * @return void - */ - public static function addGlobalScope(ScopeInterface $scope) - { - static::$globalScopes[get_called_class()][get_class($scope)] = $scope; - } - - /** - * Determine if a model has a global scope. - * - * @param \Illuminate\Database\Eloquent\ScopeInterface $scope - * @return bool - */ - public static function hasGlobalScope($scope) - { - return ! is_null(static::getGlobalScope($scope)); - } - - /** - * Get a global scope registered with the model. - * - * @param \Illuminate\Database\Eloquent\ScopeInterface $scope - * @return \Illuminate\Database\Eloquent\ScopeInterface|null - */ - public static function getGlobalScope($scope) - { - return array_first(static::$globalScopes[get_called_class()], function($key, $value) use ($scope) - { - return $scope instanceof $value; - }); - } - - /** - * Get the global scopes for this class instance. - * - * @return \Illuminate\Database\Eloquent\ScopeInterface[] - */ - public function getGlobalScopes() - { - return array_get(static::$globalScopes, get_class($this), []); - } - - /** - * Register an observer with the Model. - * - * @param object $class - * @return void - */ - public static function observe($class) - { - $instance = new static; - - $className = get_class($class); - - // When registering a model observer, we will spin through the possible events - // and determine if this observer has that method. If it does, we will hook - // it into the model's event system, making it convenient to watch these. - foreach ($instance->getObservableEvents() as $event) - { - if (method_exists($class, $event)) - { - static::registerModelEvent($event, $className.'@'.$event); - } - } - } - - /** - * Fill the model with an array of attributes. - * - * @param array $attributes - * @return $this - * - * @throws \Illuminate\Database\Eloquent\MassAssignmentException - */ - public function fill(array $attributes) - { - $totallyGuarded = $this->totallyGuarded(); - - foreach ($this->fillableFromArray($attributes) as $key => $value) - { - $key = $this->removeTableFromKey($key); - - // The developers may choose to place some attributes in the "fillable" - // array, which means only those attributes may be set through mass - // assignment to the model, and all others will just be ignored. - if ($this->isFillable($key)) - { - $this->setAttribute($key, $value); - } - elseif ($totallyGuarded) - { - throw new MassAssignmentException($key); - } - } - - return $this; - } - - /** - * Get the fillable attributes of a given array. - * - * @param array $attributes - * @return array - */ - protected function fillableFromArray(array $attributes) - { - if (count($this->fillable) > 0 && ! static::$unguarded) - { - return array_intersect_key($attributes, array_flip($this->fillable)); - } - - return $attributes; - } - - /** - * Create a new instance of the given model. - * - * @param array $attributes - * @param bool $exists - * @return static - */ - public function newInstance($attributes = array(), $exists = false) - { - // This method just provides a convenient way for us to generate fresh model - // instances of this current model. It is particularly useful during the - // hydration of new objects via the Eloquent query builder instances. - $model = new static((array) $attributes); - - $model->exists = $exists; - - return $model; - } - - /** - * Create a new model instance that is existing. - * - * @param array $attributes - * @return static - */ - public function newFromBuilder($attributes = array()) - { - $instance = $this->newInstance(array(), true); - - $instance->setRawAttributes((array) $attributes, true); - - return $instance; - } - - /** - * Create a collection of models from plain arrays. - * - * @param array $items - * @param string $connection - * @return \Illuminate\Database\Eloquent\Collection - */ - public static function hydrate(array $items, $connection = null) - { - $collection = with($instance = new static)->newCollection(); - - foreach ($items as $item) - { - $model = $instance->newFromBuilder($item); - - if ( ! is_null($connection)) - { - $model->setConnection($connection); - } - - $collection->push($model); - } - - return $collection; - } - - /** - * Create a collection of models from a raw query. - * - * @param string $query - * @param array $bindings - * @param string $connection - * @return \Illuminate\Database\Eloquent\Collection - */ - public static function hydrateRaw($query, $bindings = array(), $connection = null) - { - $instance = new static; - - if ( ! is_null($connection)) - { - $instance->setConnection($connection); - } - - $items = $instance->getConnection()->select($query, $bindings); - - return static::hydrate($items, $connection); - } - - /** - * Save a new model and return the instance. - * - * @param array $attributes - * @return static - */ - public static function create(array $attributes) - { - $model = new static($attributes); - - $model->save(); - - return $model; - } - - /** - * Get the first record matching the attributes or create it. - * - * @param array $attributes - * @return static - */ - public static function firstOrCreate(array $attributes) - { - if ( ! is_null($instance = static::where($attributes)->first())) - { - return $instance; - } - - return static::create($attributes); - } - - /** - * Get the first record matching the attributes or instantiate it. - * - * @param array $attributes - * @return static - */ - public static function firstOrNew(array $attributes) - { - if ( ! is_null($instance = static::where($attributes)->first())) - { - return $instance; - } - - return new static($attributes); - } - - /** - * Create or update a record matching the attributes, and fill it with values. - * - * @param array $attributes - * @param array $values - * @return static - */ - public static function updateOrCreate(array $attributes, array $values = array()) - { - $instance = static::firstOrNew($attributes); - - $instance->fill($values)->save(); - - return $instance; - } - - /** - * Get the first model for the given attributes. - * - * @param array $attributes - * @return static|null - */ - protected static function firstByAttributes($attributes) - { - return static::where($attributes)->first(); - } - - /** - * Begin querying the model. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - public static function query() - { - return (new static)->newQuery(); - } - - /** - * Begin querying the model on a given connection. - * - * @param string $connection - * @return \Illuminate\Database\Eloquent\Builder - */ - public static function on($connection = null) - { - // First we will just create a fresh instance of this model, and then we can - // set the connection on the model so that it is be used for the queries - // we execute, as well as being set on each relationship we retrieve. - $instance = new static; - - $instance->setConnection($connection); - - return $instance->newQuery(); - } - - /** - * Begin querying the model on the write connection. - * - * @return \Illuminate\Database\Query\Builder - */ - public static function onWriteConnection() - { - $instance = new static; - - return $instance->newQuery()->useWritePdo(); - } - - /** - * Get all of the models from the database. - * - * @param array $columns - * @return \Illuminate\Database\Eloquent\Collection|static[] - */ - public static function all($columns = array('*')) - { - $instance = new static; - - return $instance->newQuery()->get($columns); - } - - /** - * Find a model by its primary key. - * - * @param mixed $id - * @param array $columns - * @return \Illuminate\Support\Collection|static|null - */ - public static function find($id, $columns = array('*')) - { - $instance = new static; - - if (is_array($id) && empty($id)) return $instance->newCollection(); - - return $instance->newQuery()->find($id, $columns); - } - - /** - * Find a model by its primary key or return new static. - * - * @param mixed $id - * @param array $columns - * @return \Illuminate\Support\Collection|static - */ - public static function findOrNew($id, $columns = array('*')) - { - if ( ! is_null($model = static::find($id, $columns))) return $model; - - return new static; - } - - /** - * Find a model by its primary key or throw an exception. - * - * @param mixed $id - * @param array $columns - * @return \Illuminate\Support\Collection|static - * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException - */ - public static function findOrFail($id, $columns = array('*')) - { - if ( ! is_null($model = static::find($id, $columns))) return $model; - - throw (new ModelNotFoundException)->setModel(get_called_class()); - } - - /** - * Eager load relations on the model. - * - * @param array|string $relations - * @return $this - */ - public function load($relations) - { - if (is_string($relations)) $relations = func_get_args(); - - $query = $this->newQuery()->with($relations); - - $query->eagerLoadRelations(array($this)); - - return $this; - } - - /** - * Being querying a model with eager loading. - * - * @param array|string $relations - * @return \Illuminate\Database\Eloquent\Builder|static - */ - public static function with($relations) - { - if (is_string($relations)) $relations = func_get_args(); - - $instance = new static; - - return $instance->newQuery()->with($relations); - } - - /** - * Define a one-to-one relationship. - * - * @param string $related - * @param string $foreignKey - * @param string $localKey - * @return \Illuminate\Database\Eloquent\Relations\HasOne - */ - public function hasOne($related, $foreignKey = null, $localKey = null) - { - $foreignKey = $foreignKey ?: $this->getForeignKey(); - - $instance = new $related; - - $localKey = $localKey ?: $this->getKeyName(); - - return new HasOne($instance->newQuery(), $this, $instance->getTable().'.'.$foreignKey, $localKey); - } - - /** - * Define a polymorphic one-to-one relationship. - * - * @param string $related - * @param string $name - * @param string $type - * @param string $id - * @param string $localKey - * @return \Illuminate\Database\Eloquent\Relations\MorphOne - */ - public function morphOne($related, $name, $type = null, $id = null, $localKey = null) - { - $instance = new $related; - - list($type, $id) = $this->getMorphs($name, $type, $id); - - $table = $instance->getTable(); - - $localKey = $localKey ?: $this->getKeyName(); - - return new MorphOne($instance->newQuery(), $this, $table.'.'.$type, $table.'.'.$id, $localKey); - } - - /** - * Define an inverse one-to-one or many relationship. - * - * @param string $related - * @param string $foreignKey - * @param string $otherKey - * @param string $relation - * @return \Illuminate\Database\Eloquent\Relations\BelongsTo - */ - public function belongsTo($related, $foreignKey = null, $otherKey = null, $relation = null) - { - // If no relation name was given, we will use this debug backtrace to extract - // the calling method's name and use that as the relationship name as most - // of the time this will be what we desire to use for the relationships. - if (is_null($relation)) - { - list(, $caller) = debug_backtrace(false, 2); - - $relation = $caller['function']; - } - - // If no foreign key was supplied, we can use a backtrace to guess the proper - // foreign key name by using the name of the relationship function, which - // when combined with an "_id" should conventionally match the columns. - if (is_null($foreignKey)) - { - $foreignKey = snake_case($relation).'_id'; - } - - $instance = new $related; - - // Once we have the foreign key names, we'll just create a new Eloquent query - // for the related models and returns the relationship instance which will - // actually be responsible for retrieving and hydrating every relations. - $query = $instance->newQuery(); - - $otherKey = $otherKey ?: $instance->getKeyName(); - - return new BelongsTo($query, $this, $foreignKey, $otherKey, $relation); - } - - /** - * Define a polymorphic, inverse one-to-one or many relationship. - * - * @param string $name - * @param string $type - * @param string $id - * @return \Illuminate\Database\Eloquent\Relations\MorphTo - */ - public function morphTo($name = null, $type = null, $id = null) - { - // If no name is provided, we will use the backtrace to get the function name - // since that is most likely the name of the polymorphic interface. We can - // use that to get both the class and foreign key that will be utilized. - if (is_null($name)) - { - list(, $caller) = debug_backtrace(false, 2); - - $name = snake_case($caller['function']); - } - - list($type, $id) = $this->getMorphs($name, $type, $id); - - // If the type value is null it is probably safe to assume we're eager loading - // the relationship. When that is the case we will pass in a dummy query as - // there are multiple types in the morph and we can't use single queries. - if (is_null($class = $this->$type)) - { - return new MorphTo( - $this->newQuery(), $this, $id, null, $type, $name - ); - } - - // If we are not eager loading the relationship we will essentially treat this - // as a belongs-to style relationship since morph-to extends that class and - // we will pass in the appropriate values so that it behaves as expected. - else - { - $instance = new $class; - - return new MorphTo( - $instance->newQuery(), $this, $id, $instance->getKeyName(), $type, $name - ); - } - } - - /** - * Define a one-to-many relationship. - * - * @param string $related - * @param string $foreignKey - * @param string $localKey - * @return \Illuminate\Database\Eloquent\Relations\HasMany - */ - public function hasMany($related, $foreignKey = null, $localKey = null) - { - $foreignKey = $foreignKey ?: $this->getForeignKey(); - - $instance = new $related; - - $localKey = $localKey ?: $this->getKeyName(); - - return new HasMany($instance->newQuery(), $this, $instance->getTable().'.'.$foreignKey, $localKey); - } - - /** - * Define a has-many-through relationship. - * - * @param string $related - * @param string $through - * @param string|null $firstKey - * @param string|null $secondKey - * @return \Illuminate\Database\Eloquent\Relations\HasManyThrough - */ - public function hasManyThrough($related, $through, $firstKey = null, $secondKey = null) - { - $through = new $through; - - $firstKey = $firstKey ?: $this->getForeignKey(); - - $secondKey = $secondKey ?: $through->getForeignKey(); - - return new HasManyThrough((new $related)->newQuery(), $this, $through, $firstKey, $secondKey); - } - - /** - * Define a polymorphic one-to-many relationship. - * - * @param string $related - * @param string $name - * @param string $type - * @param string $id - * @param string $localKey - * @return \Illuminate\Database\Eloquent\Relations\MorphMany - */ - public function morphMany($related, $name, $type = null, $id = null, $localKey = null) - { - $instance = new $related; - - // Here we will gather up the morph type and ID for the relationship so that we - // can properly query the intermediate table of a relation. Finally, we will - // get the table and create the relationship instances for the developers. - list($type, $id) = $this->getMorphs($name, $type, $id); - - $table = $instance->getTable(); - - $localKey = $localKey ?: $this->getKeyName(); - - return new MorphMany($instance->newQuery(), $this, $table.'.'.$type, $table.'.'.$id, $localKey); - } - - /** - * Define a many-to-many relationship. - * - * @param string $related - * @param string $table - * @param string $foreignKey - * @param string $otherKey - * @param string $relation - * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany - */ - public function belongsToMany($related, $table = null, $foreignKey = null, $otherKey = null, $relation = null) - { - // If no relationship name was passed, we will pull backtraces to get the - // name of the calling function. We will use that function name as the - // title of this relation since that is a great convention to apply. - if (is_null($relation)) - { - $relation = $this->getBelongsToManyCaller(); - } - - // First, we'll need to determine the foreign key and "other key" for the - // relationship. Once we have determined the keys we'll make the query - // instances as well as the relationship instances we need for this. - $foreignKey = $foreignKey ?: $this->getForeignKey(); - - $instance = new $related; - - $otherKey = $otherKey ?: $instance->getForeignKey(); - - // If no table name was provided, we can guess it by concatenating the two - // models using underscores in alphabetical order. The two model names - // are transformed to snake case from their default CamelCase also. - if (is_null($table)) - { - $table = $this->joiningTable($related); - } - - // Now we're ready to create a new query builder for the related model and - // the relationship instances for the relation. The relations will set - // appropriate query constraint and entirely manages the hydrations. - $query = $instance->newQuery(); - - return new BelongsToMany($query, $this, $table, $foreignKey, $otherKey, $relation); - } - - /** - * Define a polymorphic many-to-many relationship. - * - * @param string $related - * @param string $name - * @param string $table - * @param string $foreignKey - * @param string $otherKey - * @param bool $inverse - * @return \Illuminate\Database\Eloquent\Relations\MorphToMany - */ - public function morphToMany($related, $name, $table = null, $foreignKey = null, $otherKey = null, $inverse = false) - { - $caller = $this->getBelongsToManyCaller(); - - // First, we will need to determine the foreign key and "other key" for the - // relationship. Once we have determined the keys we will make the query - // instances, as well as the relationship instances we need for these. - $foreignKey = $foreignKey ?: $name.'_id'; - - $instance = new $related; - - $otherKey = $otherKey ?: $instance->getForeignKey(); - - // Now we're ready to create a new query builder for this related model and - // the relationship instances for this relation. This relations will set - // appropriate query constraints then entirely manages the hydrations. - $query = $instance->newQuery(); - - $table = $table ?: str_plural($name); - - return new MorphToMany( - $query, $this, $name, $table, $foreignKey, - $otherKey, $caller, $inverse - ); - } - - /** - * Define a polymorphic, inverse many-to-many relationship. - * - * @param string $related - * @param string $name - * @param string $table - * @param string $foreignKey - * @param string $otherKey - * @return \Illuminate\Database\Eloquent\Relations\MorphToMany - */ - public function morphedByMany($related, $name, $table = null, $foreignKey = null, $otherKey = null) - { - $foreignKey = $foreignKey ?: $this->getForeignKey(); - - // For the inverse of the polymorphic many-to-many relations, we will change - // the way we determine the foreign and other keys, as it is the opposite - // of the morph-to-many method since we're figuring out these inverses. - $otherKey = $otherKey ?: $name.'_id'; - - return $this->morphToMany($related, $name, $table, $foreignKey, $otherKey, true); - } - - /** - * Get the relationship name of the belongs to many. - * - * @return string - */ - protected function getBelongsToManyCaller() - { - $self = __FUNCTION__; - - $caller = array_first(debug_backtrace(false), function($key, $trace) use ($self) - { - $caller = $trace['function']; - - return ( ! in_array($caller, Model::$manyMethods) && $caller != $self); - }); - - return ! is_null($caller) ? $caller['function'] : null; - } - - /** - * Get the joining table name for a many-to-many relation. - * - * @param string $related - * @return string - */ - public function joiningTable($related) - { - // The joining table name, by convention, is simply the snake cased models - // sorted alphabetically and concatenated with an underscore, so we can - // just sort the models and join them together to get the table name. - $base = snake_case(class_basename($this)); - - $related = snake_case(class_basename($related)); - - $models = array($related, $base); - - // Now that we have the model names in an array we can just sort them and - // use the implode function to join them together with an underscores, - // which is typically used by convention within the database system. - sort($models); - - return strtolower(implode('_', $models)); - } - - /** - * Destroy the models for the given IDs. - * - * @param array|int $ids - * @return int - */ - public static function destroy($ids) - { - // We'll initialize a count here so we will return the total number of deletes - // for the operation. The developers can then check this number as a boolean - // type value or get this total count of records deleted for logging, etc. - $count = 0; - - $ids = is_array($ids) ? $ids : func_get_args(); - - $instance = new static; - - // We will actually pull the models from the database table and call delete on - // each of them individually so that their events get fired properly with a - // correct set of attributes in case the developers wants to check these. - $key = $instance->getKeyName(); - - foreach ($instance->whereIn($key, $ids)->get() as $model) - { - if ($model->delete()) $count++; - } - - return $count; - } - - /** - * Delete the model from the database. - * - * @return bool|null - * @throws \Exception - */ - public function delete() - { - if (is_null($this->primaryKey)) - { - throw new \Exception("No primary key defined on model."); - } - - if ($this->exists) - { - if ($this->fireModelEvent('deleting') === false) return false; - - // Here, we'll touch the owning models, verifying these timestamps get updated - // for the models. This will allow any caching to get broken on the parents - // by the timestamp. Then we will go ahead and delete the model instance. - $this->touchOwners(); - - $this->performDeleteOnModel(); - - $this->exists = false; - - // Once the model has been deleted, we will fire off the deleted event so that - // the developers may hook into post-delete operations. We will then return - // a boolean true as the delete is presumably successful on the database. - $this->fireModelEvent('deleted', false); - - return true; - } - } - - /** - * Force a hard delete on a soft deleted model. - * - * This method protects developers from running forceDelete when trait is missing. - * - * @return void - */ - public function forceDelete() - { - return $this->delete(); - } - - /** - * Perform the actual delete query on this model instance. - * - * @return void - */ - protected function performDeleteOnModel() - { - $this->newQuery()->where($this->getKeyName(), $this->getKey())->delete(); - } - - /** - * Register a saving model event with the dispatcher. - * - * @param \Closure|string $callback - * @return void - */ - public static function saving($callback) - { - static::registerModelEvent('saving', $callback); - } - - /** - * Register a saved model event with the dispatcher. - * - * @param \Closure|string $callback - * @return void - */ - public static function saved($callback) - { - static::registerModelEvent('saved', $callback); - } - - /** - * Register an updating model event with the dispatcher. - * - * @param \Closure|string $callback - * @return void - */ - public static function updating($callback) - { - static::registerModelEvent('updating', $callback); - } - - /** - * Register an updated model event with the dispatcher. - * - * @param \Closure|string $callback - * @return void - */ - public static function updated($callback) - { - static::registerModelEvent('updated', $callback); - } - - /** - * Register a creating model event with the dispatcher. - * - * @param \Closure|string $callback - * @return void - */ - public static function creating($callback) - { - static::registerModelEvent('creating', $callback); - } - - /** - * Register a created model event with the dispatcher. - * - * @param \Closure|string $callback - * @return void - */ - public static function created($callback) - { - static::registerModelEvent('created', $callback); - } - - /** - * Register a deleting model event with the dispatcher. - * - * @param \Closure|string $callback - * @return void - */ - public static function deleting($callback) - { - static::registerModelEvent('deleting', $callback); - } - - /** - * Register a deleted model event with the dispatcher. - * - * @param \Closure|string $callback - * @return void - */ - public static function deleted($callback) - { - static::registerModelEvent('deleted', $callback); - } - - /** - * Remove all of the event listeners for the model. - * - * @return void - */ - public static function flushEventListeners() - { - if ( ! isset(static::$dispatcher)) return; - - $instance = new static; - - foreach ($instance->getObservableEvents() as $event) - { - static::$dispatcher->forget("eloquent.{$event}: ".get_called_class()); - } - } - - /** - * Register a model event with the dispatcher. - * - * @param string $event - * @param \Closure|string $callback - * @return void - */ - protected static function registerModelEvent($event, $callback) - { - if (isset(static::$dispatcher)) - { - $name = get_called_class(); - - static::$dispatcher->listen("eloquent.{$event}: {$name}", $callback); - } - } - - /** - * Get the observable event names. - * - * @return array - */ - public function getObservableEvents() - { - return array_merge( - array( - 'creating', 'created', 'updating', 'updated', - 'deleting', 'deleted', 'saving', 'saved', - 'restoring', 'restored', - ), - $this->observables - ); - } - - /** - * Set the observable event names. - * - * @param array $observables - * @return void - */ - public function setObservableEvents(array $observables) - { - $this->observables = $observables; - } - - /** - * Add an observable event name. - * - * @param mixed $observables - * @return void - */ - public function addObservableEvents($observables) - { - $observables = is_array($observables) ? $observables : func_get_args(); - - $this->observables = array_unique(array_merge($this->observables, $observables)); - } - - /** - * Remove an observable event name. - * - * @param mixed $observables - * @return void - */ - public function removeObservableEvents($observables) - { - $observables = is_array($observables) ? $observables : func_get_args(); - - $this->observables = array_diff($this->observables, $observables); - } - - /** - * Increment a column's value by a given amount. - * - * @param string $column - * @param int $amount - * @return int - */ - protected function increment($column, $amount = 1) - { - return $this->incrementOrDecrement($column, $amount, 'increment'); - } - - /** - * Decrement a column's value by a given amount. - * - * @param string $column - * @param int $amount - * @return int - */ - protected function decrement($column, $amount = 1) - { - return $this->incrementOrDecrement($column, $amount, 'decrement'); - } - - /** - * Run the increment or decrement method on the model. - * - * @param string $column - * @param int $amount - * @param string $method - * @return int - */ - protected function incrementOrDecrement($column, $amount, $method) - { - $query = $this->newQuery(); - - if ( ! $this->exists) - { - return $query->{$method}($column, $amount); - } - - $this->incrementOrDecrementAttributeValue($column, $amount, $method); - - return $query->where($this->getKeyName(), $this->getKey())->{$method}($column, $amount); - } - - /** - * Increment the underlying attribute value and sync with original. - * - * @param string $column - * @param int $amount - * @param string $method - * @return void - */ - protected function incrementOrDecrementAttributeValue($column, $amount, $method) - { - $this->{$column} = $this->{$column} + ($method == 'increment' ? $amount : $amount * -1); - - $this->syncOriginalAttribute($column); - } - - /** - * Update the model in the database. - * - * @param array $attributes - * @return bool|int - */ - public function update(array $attributes = array()) - { - if ( ! $this->exists) - { - return $this->newQuery()->update($attributes); - } - - return $this->fill($attributes)->save(); - } - - /** - * Save the model and all of its relationships. - * - * @return bool - */ - public function push() - { - if ( ! $this->save()) return false; - - // To sync all of the relationships to the database, we will simply spin through - // the relationships and save each model via this "push" method, which allows - // us to recurse into all of these nested relations for the model instance. - foreach ($this->relations as $models) - { - foreach (Collection::make($models) as $model) - { - if ( ! $model->push()) return false; - } - } - - return true; - } - - /** - * Save the model to the database. - * - * @param array $options - * @return bool - */ - public function save(array $options = array()) - { - $query = $this->newQueryWithoutScopes(); - - // If the "saving" event returns false we'll bail out of the save and return - // false, indicating that the save failed. This provides a chance for any - // listeners to cancel save operations if validations fail or whatever. - if ($this->fireModelEvent('saving') === false) - { - return false; - } - - // If the model already exists in the database we can just update our record - // that is already in this database using the current IDs in this "where" - // clause to only update this model. Otherwise, we'll just insert them. - if ($this->exists) - { - $saved = $this->performUpdate($query, $options); - } - - // If the model is brand new, we'll insert it into our database and set the - // ID attribute on the model to the value of the newly inserted row's ID - // which is typically an auto-increment value managed by the database. - else - { - $saved = $this->performInsert($query, $options); - } - - if ($saved) $this->finishSave($options); - - return $saved; - } - - /** - * Finish processing on a successful save operation. - * - * @param array $options - * @return void - */ - protected function finishSave(array $options) - { - $this->fireModelEvent('saved', false); - - $this->syncOriginal(); - - if (array_get($options, 'touch', true)) $this->touchOwners(); - } - - /** - * Perform a model update operation. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param array $options - * @return bool|null - */ - protected function performUpdate(Builder $query, array $options = []) - { - $dirty = $this->getDirty(); - - if (count($dirty) > 0) - { - // If the updating event returns false, we will cancel the update operation so - // developers can hook Validation systems into their models and cancel this - // operation if the model does not pass validation. Otherwise, we update. - if ($this->fireModelEvent('updating') === false) - { - return false; - } - - // First we need to create a fresh query instance and touch the creation and - // update timestamp on the model which are maintained by us for developer - // convenience. Then we will just continue saving the model instances. - if ($this->timestamps && array_get($options, 'timestamps', true)) - { - $this->updateTimestamps(); - } - - // Once we have run the update operation, we will fire the "updated" event for - // this model instance. This will allow developers to hook into these after - // models are updated, giving them a chance to do any special processing. - $dirty = $this->getDirty(); - - if (count($dirty) > 0) - { - $this->setKeysForSaveQuery($query)->update($dirty); - - $this->fireModelEvent('updated', false); - } - } - - return true; - } - - /** - * Perform a model insert operation. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param array $options - * @return bool - */ - protected function performInsert(Builder $query, array $options = []) - { - if ($this->fireModelEvent('creating') === false) return false; - - // First we'll need to create a fresh query instance and touch the creation and - // update timestamps on this model, which are maintained by us for developer - // convenience. After, we will just continue saving these model instances. - if ($this->timestamps && array_get($options, 'timestamps', true)) - { - $this->updateTimestamps(); - } - - // If the model has an incrementing key, we can use the "insertGetId" method on - // the query builder, which will give us back the final inserted ID for this - // table from the database. Not all tables have to be incrementing though. - $attributes = $this->attributes; - - if ($this->incrementing) - { - $this->insertAndSetId($query, $attributes); - } - - // If the table is not incrementing we'll simply insert this attributes as they - // are, as this attributes arrays must contain an "id" column already placed - // there by the developer as the manually determined key for these models. - else - { - $query->insert($attributes); - } - - // We will go ahead and set the exists property to true, so that it is set when - // the created event is fired, just in case the developer tries to update it - // during the event. This will allow them to do so and run an update here. - $this->exists = true; - - $this->fireModelEvent('created', false); - - return true; - } - - /** - * Insert the given attributes and set the ID on the model. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param array $attributes - * @return void - */ - protected function insertAndSetId(Builder $query, $attributes) - { - $id = $query->insertGetId($attributes, $keyName = $this->getKeyName()); - - $this->setAttribute($keyName, $id); - } - - /** - * Touch the owning relations of the model. - * - * @return void - */ - public function touchOwners() - { - foreach ($this->touches as $relation) - { - $this->$relation()->touch(); - - if ( ! is_null($this->$relation)) - { - $this->$relation->touchOwners(); - } - } - } - - /** - * Determine if the model touches a given relation. - * - * @param string $relation - * @return bool - */ - public function touches($relation) - { - return in_array($relation, $this->touches); - } - - /** - * Fire the given event for the model. - * - * @param string $event - * @param bool $halt - * @return mixed - */ - protected function fireModelEvent($event, $halt = true) - { - if ( ! isset(static::$dispatcher)) return true; - - // We will append the names of the class to the event to distinguish it from - // other model events that are fired, allowing us to listen on each model - // event set individually instead of catching event for all the models. - $event = "eloquent.{$event}: ".get_class($this); - - $method = $halt ? 'until' : 'fire'; - - return static::$dispatcher->$method($event, $this); - } - - /** - * Set the keys for a save update query. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @return \Illuminate\Database\Eloquent\Builder - */ - protected function setKeysForSaveQuery(Builder $query) - { - $query->where($this->getKeyName(), '=', $this->getKeyForSaveQuery()); - - return $query; - } - - /** - * Get the primary key value for a save query. - * - * @return mixed - */ - protected function getKeyForSaveQuery() - { - if (isset($this->original[$this->getKeyName()])) - { - return $this->original[$this->getKeyName()]; - } - - return $this->getAttribute($this->getKeyName()); - } - - /** - * Update the model's update timestamp. - * - * @return bool - */ - public function touch() - { - $this->updateTimestamps(); - - return $this->save(); - } - - /** - * Update the creation and update timestamps. - * - * @return void - */ - protected function updateTimestamps() - { - $time = $this->freshTimestamp(); - - if ( ! $this->isDirty(static::UPDATED_AT)) - { - $this->setUpdatedAt($time); - } - - if ( ! $this->exists && ! $this->isDirty(static::CREATED_AT)) - { - $this->setCreatedAt($time); - } - } - - /** - * Set the value of the "created at" attribute. - * - * @param mixed $value - * @return void - */ - public function setCreatedAt($value) - { - $this->{static::CREATED_AT} = $value; - } - - /** - * Set the value of the "updated at" attribute. - * - * @param mixed $value - * @return void - */ - public function setUpdatedAt($value) - { - $this->{static::UPDATED_AT} = $value; - } - - /** - * Get the name of the "created at" column. - * - * @return string - */ - public function getCreatedAtColumn() - { - return static::CREATED_AT; - } - - /** - * Get the name of the "updated at" column. - * - * @return string - */ - public function getUpdatedAtColumn() - { - return static::UPDATED_AT; - } - - /** - * Get a fresh timestamp for the model. - * - * @return \Carbon\Carbon - */ - public function freshTimestamp() - { - return new Carbon; - } - - /** - * Get a fresh timestamp for the model. - * - * @return string - */ - public function freshTimestampString() - { - return $this->fromDateTime($this->freshTimestamp()); - } - - /** - * Get a new query builder for the model's table. - * - * @return \Illuminate\Database\Eloquent\Builder - */ - public function newQuery() - { - $builder = $this->newQueryWithoutScopes(); - - return $this->applyGlobalScopes($builder); - } - - /** - * Get a new query instance without a given scope. - * - * @param \Illuminate\Database\Eloquent\ScopeInterface $scope - * @return \Illuminate\Database\Eloquent\Builder - */ - public function newQueryWithoutScope($scope) - { - $this->getGlobalScope($scope)->remove($builder = $this->newQuery(), $this); - - return $builder; - } - - /** - * Get a new query builder that doesn't have any global scopes. - * - * @return \Illuminate\Database\Eloquent\Builder|static - */ - public function newQueryWithoutScopes() - { - $builder = $this->newEloquentBuilder( - $this->newBaseQueryBuilder() - ); - - // Once we have the query builders, we will set the model instances so the - // builder can easily access any information it may need from the model - // while it is constructing and executing various queries against it. - return $builder->setModel($this)->with($this->with); - } - - /** - * Apply all of the global scopes to an Eloquent builder. - * - * @param \Illuminate\Database\Eloquent\Builder $builder - * @return \Illuminate\Database\Eloquent\Builder - */ - public function applyGlobalScopes($builder) - { - foreach ($this->getGlobalScopes() as $scope) - { - $scope->apply($builder, $this); - } - - return $builder; - } - - /** - * Remove all of the global scopes from an Eloquent builder. - * - * @param \Illuminate\Database\Eloquent\Builder $builder - * @return \Illuminate\Database\Eloquent\Builder - */ - public function removeGlobalScopes($builder) - { - foreach ($this->getGlobalScopes() as $scope) - { - $scope->remove($builder, $this); - } - - return $builder; - } - - /** - * Create a new Eloquent query builder for the model. - * - * @param \Illuminate\Database\Query\Builder $query - * @return \Illuminate\Database\Eloquent\Builder|static - */ - public function newEloquentBuilder($query) - { - return new Builder($query); - } - - /** - * Get a new query builder instance for the connection. - * - * @return \Illuminate\Database\Query\Builder - */ - protected function newBaseQueryBuilder() - { - $conn = $this->getConnection(); - - $grammar = $conn->getQueryGrammar(); - - return new QueryBuilder($conn, $grammar, $conn->getPostProcessor()); - } - - /** - * Create a new Eloquent Collection instance. - * - * @param array $models - * @return \Illuminate\Database\Eloquent\Collection - */ - public function newCollection(array $models = array()) - { - return new Collection($models); - } - - /** - * Create a new pivot model instance. - * - * @param \Illuminate\Database\Eloquent\Model $parent - * @param array $attributes - * @param string $table - * @param bool $exists - * @return \Illuminate\Database\Eloquent\Relations\Pivot - */ - public function newPivot(Model $parent, array $attributes, $table, $exists) - { - return new Pivot($parent, $attributes, $table, $exists); - } - - /** - * Get the table associated with the model. - * - * @return string - */ - public function getTable() - { - if (isset($this->table)) return $this->table; - - return str_replace('\\', '', snake_case(str_plural(class_basename($this)))); - } - - /** - * Set the table associated with the model. - * - * @param string $table - * @return void - */ - public function setTable($table) - { - $this->table = $table; - } - - /** - * Get the value of the model's primary key. - * - * @return mixed - */ - public function getKey() - { - return $this->getAttribute($this->getKeyName()); - } - - /** - * Get the primary key for the model. - * - * @return string - */ - public function getKeyName() - { - return $this->primaryKey; - } - - /** - * Set the primary key for the model. - * - * @param string $key - * @return void - */ - public function setKeyName($key) - { - $this->primaryKey = $key; - } - - /** - * Get the table qualified key name. - * - * @return string - */ - public function getQualifiedKeyName() - { - return $this->getTable().'.'.$this->getKeyName(); - } - - /** - * Determine if the model uses timestamps. - * - * @return bool - */ - public function usesTimestamps() - { - return $this->timestamps; - } - - /** - * Get the polymorphic relationship columns. - * - * @param string $name - * @param string $type - * @param string $id - * @return array - */ - protected function getMorphs($name, $type, $id) - { - $type = $type ?: $name.'_type'; - - $id = $id ?: $name.'_id'; - - return array($type, $id); - } - - /** - * Get the class name for polymorphic relations. - * - * @return string - */ - public function getMorphClass() - { - return $this->morphClass ?: get_class($this); - } - - /** - * Get the number of models to return per page. - * - * @return int - */ - public function getPerPage() - { - return $this->perPage; - } - - /** - * Set the number of models to return per page. - * - * @param int $perPage - * @return void - */ - public function setPerPage($perPage) - { - $this->perPage = $perPage; - } - - /** - * Get the default foreign key name for the model. - * - * @return string - */ - public function getForeignKey() - { - return snake_case(class_basename($this)).'_id'; - } - - /** - * Get the hidden attributes for the model. - * - * @return array - */ - public function getHidden() - { - return $this->hidden; - } - - /** - * Set the hidden attributes for the model. - * - * @param array $hidden - * @return void - */ - public function setHidden(array $hidden) - { - $this->hidden = $hidden; - } - - /** - * Set the visible attributes for the model. - * - * @param array $visible - * @return void - */ - public function setVisible(array $visible) - { - $this->visible = $visible; - } - - /** - * Set the accessors to append to model arrays. - * - * @param array $appends - * @return void - */ - public function setAppends(array $appends) - { - $this->appends = $appends; - } - - /** - * Get the fillable attributes for the model. - * - * @return array - */ - public function getFillable() - { - return $this->fillable; - } - - /** - * Set the fillable attributes for the model. - * - * @param array $fillable - * @return $this - */ - public function fillable(array $fillable) - { - $this->fillable = $fillable; - - return $this; - } - - /** - * get the guarded attributes for the model. - * - * @return array - */ - public function getGuarded() - { - return $this->guarded; - } - - /** - * Set the guarded attributes for the model. - * - * @param array $guarded - * @return $this - */ - public function guard(array $guarded) - { - $this->guarded = $guarded; - - return $this; - } - - /** - * Disable all mass assignable restrictions. - * - * @return void - */ - public static function unguard() - { - static::$unguarded = true; - } - - /** - * Enable the mass assignment restrictions. - * - * @return void - */ - public static function reguard() - { - static::$unguarded = false; - } - - /** - * Set "unguard" to a given state. - * - * @param bool $state - * @return void - */ - public static function setUnguardState($state) - { - static::$unguarded = $state; - } - - /** - * Determine if the given attribute may be mass assigned. - * - * @param string $key - * @return bool - */ - public function isFillable($key) - { - if (static::$unguarded) return true; - - // If the key is in the "fillable" array, we can of course assume that it's - // a fillable attribute. Otherwise, we will check the guarded array when - // we need to determine if the attribute is black-listed on the model. - if (in_array($key, $this->fillable)) return true; - - if ($this->isGuarded($key)) return false; - - return empty($this->fillable) && ! starts_with($key, '_'); - } - - /** - * Determine if the given key is guarded. - * - * @param string $key - * @return bool - */ - public function isGuarded($key) - { - return in_array($key, $this->guarded) || $this->guarded == array('*'); - } - - /** - * Determine if the model is totally guarded. - * - * @return bool - */ - public function totallyGuarded() - { - return count($this->fillable) == 0 && $this->guarded == array('*'); - } - - /** - * Remove the table name from a given key. - * - * @param string $key - * @return string - */ - protected function removeTableFromKey($key) - { - if ( ! str_contains($key, '.')) return $key; - - return last(explode('.', $key)); - } - - /** - * Get the relationships that are touched on save. - * - * @return array - */ - public function getTouchedRelations() - { - return $this->touches; - } - - /** - * Set the relationships that are touched on save. - * - * @param array $touches - * @return void - */ - public function setTouchedRelations(array $touches) - { - $this->touches = $touches; - } - - /** - * Get the value indicating whether the IDs are incrementing. - * - * @return bool - */ - public function getIncrementing() - { - return $this->incrementing; - } - - /** - * Set whether IDs are incrementing. - * - * @param bool $value - * @return void - */ - public function setIncrementing($value) - { - $this->incrementing = $value; - } - - /** - * Convert the model instance to JSON. - * - * @param int $options - * @return string - */ - public function toJson($options = 0) - { - return json_encode($this->toArray(), $options); - } - - /** - * Convert the object into something JSON serializable. - * - * @return array - */ - public function jsonSerialize() - { - return $this->toArray(); - } - - /** - * Convert the model instance to an array. - * - * @return array - */ - public function toArray() - { - $attributes = $this->attributesToArray(); - - return array_merge($attributes, $this->relationsToArray()); - } - - /** - * Convert the model's attributes to an array. - * - * @return array - */ - public function attributesToArray() - { - $attributes = $this->getArrayableAttributes(); - - // If an attribute is a date, we will cast it to a string after converting it - // to a DateTime / Carbon instance. This is so we will get some consistent - // formatting while accessing attributes vs. arraying / JSONing a model. - foreach ($this->getDates() as $key) - { - if ( ! isset($attributes[$key])) continue; - - $attributes[$key] = (string) $this->asDateTime($attributes[$key]); - } - - // We want to spin through all the mutated attributes for this model and call - // the mutator for the attribute. We cache off every mutated attributes so - // we don't have to constantly check on attributes that actually change. - foreach ($this->getMutatedAttributes() as $key) - { - if ( ! array_key_exists($key, $attributes)) continue; - - $attributes[$key] = $this->mutateAttributeForArray( - $key, $attributes[$key] - ); - } - - // Here we will grab all of the appended, calculated attributes to this model - // as these attributes are not really in the attributes array, but are run - // when we need to array or JSON the model for convenience to the coder. - foreach ($this->getArrayableAppends() as $key) - { - $attributes[$key] = $this->mutateAttributeForArray($key, null); - } - - return $attributes; - } - - /** - * Get an attribute array of all arrayable attributes. - * - * @return array - */ - protected function getArrayableAttributes() - { - return $this->getArrayableItems($this->attributes); - } - - /** - * Get all of the appendable values that are arrayable. - * - * @return array - */ - protected function getArrayableAppends() - { - if ( ! count($this->appends)) return []; - - return $this->getArrayableItems( - array_combine($this->appends, $this->appends) - ); - } - - /** - * Get the model's relationships in array form. - * - * @return array - */ - public function relationsToArray() - { - $attributes = array(); - - foreach ($this->getArrayableRelations() as $key => $value) - { - if (in_array($key, $this->hidden)) continue; - - // If the values implements the Arrayable interface we can just call this - // toArray method on the instances which will convert both models and - // collections to their proper array form and we'll set the values. - if ($value instanceof ArrayableInterface) - { - $relation = $value->toArray(); - } - - // If the value is null, we'll still go ahead and set it in this list of - // attributes since null is used to represent empty relationships if - // if it a has one or belongs to type relationships on the models. - elseif (is_null($value)) - { - $relation = $value; - } - - // If the relationships snake-casing is enabled, we will snake case this - // key so that the relation attribute is snake cased in this returned - // array to the developers, making this consistent with attributes. - if (static::$snakeAttributes) - { - $key = snake_case($key); - } - - // If the relation value has been set, we will set it on this attributes - // list for returning. If it was not arrayable or null, we'll not set - // the value on the array because it is some type of invalid value. - if (isset($relation) || is_null($value)) - { - $attributes[$key] = $relation; - } - - unset($relation); - } - - return $attributes; - } - - /** - * Get an attribute array of all arrayable relations. - * - * @return array - */ - protected function getArrayableRelations() - { - return $this->getArrayableItems($this->relations); - } - - /** - * Get an attribute array of all arrayable values. - * - * @param array $values - * @return array - */ - protected function getArrayableItems(array $values) - { - if (count($this->visible) > 0) - { - return array_intersect_key($values, array_flip($this->visible)); - } - - return array_diff_key($values, array_flip($this->hidden)); - } - - /** - * Get an attribute from the model. - * - * @param string $key - * @return mixed - */ - public function getAttribute($key) - { - $inAttributes = array_key_exists($key, $this->attributes); - - // If the key references an attribute, we can just go ahead and return the - // plain attribute value from the model. This allows every attribute to - // be dynamically accessed through the _get method without accessors. - if ($inAttributes || $this->hasGetMutator($key)) - { - return $this->getAttributeValue($key); - } - - // If the key already exists in the relationships array, it just means the - // relationship has already been loaded, so we'll just return it out of - // here because there is no need to query within the relations twice. - if (array_key_exists($key, $this->relations)) - { - return $this->relations[$key]; - } - - // If the "attribute" exists as a method on the model, we will just assume - // it is a relationship and will load and return results from the query - // and hydrate the relationship's value on the "relationships" array. - $camelKey = camel_case($key); - - if (method_exists($this, $camelKey)) - { - return $this->getRelationshipFromMethod($key, $camelKey); - } - } - - /** - * Get a plain attribute (not a relationship). - * - * @param string $key - * @return mixed - */ - protected function getAttributeValue($key) - { - $value = $this->getAttributeFromArray($key); - - // If the attribute has a get mutator, we will call that then return what - // it returns as the value, which is useful for transforming values on - // retrieval from the model to a form that is more useful for usage. - if ($this->hasGetMutator($key)) - { - return $this->mutateAttribute($key, $value); - } - - // If the attribute is listed as a date, we will convert it to a DateTime - // instance on retrieval, which makes it quite convenient to work with - // date fields without having to create a mutator for each property. - elseif (in_array($key, $this->getDates())) - { - if ($value) return $this->asDateTime($value); - } - - return $value; - } - - /** - * Get an attribute from the $attributes array. - * - * @param string $key - * @return mixed - */ - protected function getAttributeFromArray($key) - { - if (array_key_exists($key, $this->attributes)) - { - return $this->attributes[$key]; - } - } - - /** - * Get a relationship value from a method. - * - * @param string $key - * @param string $camelKey - * @return mixed - * - * @throws \LogicException - */ - protected function getRelationshipFromMethod($key, $camelKey) - { - $relations = $this->$camelKey(); - - if ( ! $relations instanceof Relation) - { - throw new LogicException('Relationship method must return an object of type ' - . 'Illuminate\Database\Eloquent\Relations\Relation'); - } - - return $this->relations[$key] = $relations->getResults(); - } - - /** - * Determine if a get mutator exists for an attribute. - * - * @param string $key - * @return bool - */ - public function hasGetMutator($key) - { - return method_exists($this, 'get'.studly_case($key).'Attribute'); - } - - /** - * Get the value of an attribute using its mutator. - * - * @param string $key - * @param mixed $value - * @return mixed - */ - protected function mutateAttribute($key, $value) - { - return $this->{'get'.studly_case($key).'Attribute'}($value); - } - - /** - * Get the value of an attribute using its mutator for array conversion. - * - * @param string $key - * @param mixed $value - * @return mixed - */ - protected function mutateAttributeForArray($key, $value) - { - $value = $this->mutateAttribute($key, $value); - - return $value instanceof ArrayableInterface ? $value->toArray() : $value; - } - - /** - * Set a given attribute on the model. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function setAttribute($key, $value) - { - // First we will check for the presence of a mutator for the set operation - // which simply lets the developers tweak the attribute as it is set on - // the model, such as "json_encoding" an listing of data for storage. - if ($this->hasSetMutator($key)) - { - $method = 'set'.studly_case($key).'Attribute'; - - return $this->{$method}($value); - } - - // If an attribute is listed as a "date", we'll convert it from a DateTime - // instance into a form proper for storage on the database tables using - // the connection grammar's date format. We will auto set the values. - elseif (in_array($key, $this->getDates()) && $value) - { - $value = $this->fromDateTime($value); - } - - $this->attributes[$key] = $value; - } - - /** - * Determine if a set mutator exists for an attribute. - * - * @param string $key - * @return bool - */ - public function hasSetMutator($key) - { - return method_exists($this, 'set'.studly_case($key).'Attribute'); - } - - /** - * Get the attributes that should be converted to dates. - * - * @return array - */ - public function getDates() - { - $defaults = array(static::CREATED_AT, static::UPDATED_AT); - - return array_merge($this->dates, $defaults); - } - - /** - * Convert a DateTime to a storable string. - * - * @param \DateTime|int $value - * @return string - */ - public function fromDateTime($value) - { - $format = $this->getDateFormat(); - - // If the value is already a DateTime instance, we will just skip the rest of - // these checks since they will be a waste of time, and hinder performance - // when checking the field. We will just return the DateTime right away. - if ($value instanceof DateTime) - { - // - } - - // If the value is totally numeric, we will assume it is a UNIX timestamp and - // format the date as such. Once we have the date in DateTime form we will - // format it according to the proper format for the database connection. - elseif (is_numeric($value)) - { - $value = Carbon::createFromTimestamp($value); - } - - // If the value is in simple year, month, day format, we will format it using - // that setup. This is for simple "date" fields which do not have hours on - // the field. This conveniently picks up those dates and format correct. - elseif (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $value)) - { - $value = Carbon::createFromFormat('Y-m-d', $value)->startOfDay(); - } - - // If this value is some other type of string, we'll create the DateTime with - // the format used by the database connection. Once we get the instance we - // can return back the finally formatted DateTime instances to the devs. - else - { - $value = Carbon::createFromFormat($format, $value); - } - - return $value->format($format); - } - - /** - * Return a timestamp as DateTime object. - * - * @param mixed $value - * @return \Carbon\Carbon - */ - protected function asDateTime($value) - { - // If this value is an integer, we will assume it is a UNIX timestamp's value - // and format a Carbon object from this timestamp. This allows flexibility - // when defining your date fields as they might be UNIX timestamps here. - if (is_numeric($value)) - { - return Carbon::createFromTimestamp($value); - } - - // If the value is in simply year, month, day format, we will instantiate the - // Carbon instances from that format. Again, this provides for simple date - // fields on the database, while still supporting Carbonized conversion. - elseif (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $value)) - { - return Carbon::createFromFormat('Y-m-d', $value)->startOfDay(); - } - - // Finally, we will just assume this date is in the format used by default on - // the database connection and use that format to create the Carbon object - // that is returned back out to the developers after we convert it here. - elseif ( ! $value instanceof DateTime) - { - $format = $this->getDateFormat(); - - return Carbon::createFromFormat($format, $value); - } - - return Carbon::instance($value); - } - - /** - * Get the format for database stored dates. - * - * @return string - */ - protected function getDateFormat() - { - return $this->getConnection()->getQueryGrammar()->getDateFormat(); - } - - /** - * Clone the model into a new, non-existing instance. - * - * @param array $except - * @return \Illuminate\Database\Eloquent\Model - */ - public function replicate(array $except = null) - { - $except = $except ?: [ - $this->getKeyName(), - $this->getCreatedAtColumn(), - $this->getUpdatedAtColumn(), - ]; - - $attributes = array_except($this->attributes, $except); - - with($instance = new static)->setRawAttributes($attributes); - - return $instance->setRelations($this->relations); - } - - /** - * Get all of the current attributes on the model. - * - * @return array - */ - public function getAttributes() - { - return $this->attributes; - } - - /** - * Set the array of model attributes. No checking is done. - * - * @param array $attributes - * @param bool $sync - * @return void - */ - public function setRawAttributes(array $attributes, $sync = false) - { - $this->attributes = $attributes; - - if ($sync) $this->syncOriginal(); - } - - /** - * Get the model's original attribute values. - * - * @param string $key - * @param mixed $default - * @return array - */ - public function getOriginal($key = null, $default = null) - { - return array_get($this->original, $key, $default); - } - - /** - * Sync the original attributes with the current. - * - * @return $this - */ - public function syncOriginal() - { - $this->original = $this->attributes; - - return $this; - } - - /** - * Sync a single original attribute with its current value. - * - * @param string $attribute - * @return $this - */ - public function syncOriginalAttribute($attribute) - { - $this->original[$attribute] = $this->attributes[$attribute]; - - return $this; - } - - /** - * Determine if the model or given attribute(s) have been modified. - * - * @param array|string|null $attributes - * @return bool - */ - public function isDirty($attributes = null) - { - $dirty = $this->getDirty(); - - if (is_null($attributes)) return count($dirty) > 0; - - if ( ! is_array($attributes)) $attributes = func_get_args(); - - foreach ($attributes as $attribute) - { - if (array_key_exists($attribute, $dirty)) return true; - } - - return false; - } - - /** - * Get the attributes that have been changed since last sync. - * - * @return array - */ - public function getDirty() - { - $dirty = array(); - - foreach ($this->attributes as $key => $value) - { - if ( ! array_key_exists($key, $this->original)) - { - $dirty[$key] = $value; - } - elseif ($value !== $this->original[$key] && - ! $this->originalIsNumericallyEquivalent($key)) - { - $dirty[$key] = $value; - } - } - - return $dirty; - } - - /** - * Determine if the new and old values for a given key are numerically equivalent. - * - * @param string $key - * @return bool - */ - protected function originalIsNumericallyEquivalent($key) - { - $current = $this->attributes[$key]; - - $original = $this->original[$key]; - - return is_numeric($current) && is_numeric($original) && strcmp((string) $current, (string) $original) === 0; - } - - /** - * Get all the loaded relations for the instance. - * - * @return array - */ - public function getRelations() - { - return $this->relations; - } - - /** - * Get a specified relationship. - * - * @param string $relation - * @return mixed - */ - public function getRelation($relation) - { - return $this->relations[$relation]; - } - - /** - * Set the specific relationship in the model. - * - * @param string $relation - * @param mixed $value - * @return $this - */ - public function setRelation($relation, $value) - { - $this->relations[$relation] = $value; - - return $this; - } - - /** - * Set the entire relations array on the model. - * - * @param array $relations - * @return $this - */ - public function setRelations(array $relations) - { - $this->relations = $relations; - - return $this; - } - - /** - * Get the database connection for the model. - * - * @return \Illuminate\Database\Connection - */ - public function getConnection() - { - return static::resolveConnection($this->connection); - } - - /** - * Get the current connection name for the model. - * - * @return string - */ - public function getConnectionName() - { - return $this->connection; - } - - /** - * Set the connection associated with the model. - * - * @param string $name - * @return $this - */ - public function setConnection($name) - { - $this->connection = $name; - - return $this; - } - - /** - * Resolve a connection instance. - * - * @param string $connection - * @return \Illuminate\Database\Connection - */ - public static function resolveConnection($connection = null) - { - return static::$resolver->connection($connection); - } - - /** - * Get the connection resolver instance. - * - * @return \Illuminate\Database\ConnectionResolverInterface - */ - public static function getConnectionResolver() - { - return static::$resolver; - } - - /** - * Set the connection resolver instance. - * - * @param \Illuminate\Database\ConnectionResolverInterface $resolver - * @return void - */ - public static function setConnectionResolver(Resolver $resolver) - { - static::$resolver = $resolver; - } - - /** - * Unset the connection resolver for models. - * - * @return void - */ - public static function unsetConnectionResolver() - { - static::$resolver = null; - } - - /** - * Get the event dispatcher instance. - * - * @return \Illuminate\Events\Dispatcher - */ - public static function getEventDispatcher() - { - return static::$dispatcher; - } - - /** - * Set the event dispatcher instance. - * - * @param \Illuminate\Events\Dispatcher $dispatcher - * @return void - */ - public static function setEventDispatcher(Dispatcher $dispatcher) - { - static::$dispatcher = $dispatcher; - } - - /** - * Unset the event dispatcher for models. - * - * @return void - */ - public static function unsetEventDispatcher() - { - static::$dispatcher = null; - } - - /** - * Get the mutated attributes for a given instance. - * - * @return array - */ - public function getMutatedAttributes() - { - $class = get_class($this); - - if (isset(static::$mutatorCache[$class])) - { - return static::$mutatorCache[$class]; - } - - return array(); - } - - /** - * Dynamically retrieve attributes on the model. - * - * @param string $key - * @return mixed - */ - public function __get($key) - { - return $this->getAttribute($key); - } - - /** - * Dynamically set attributes on the model. - * - * @param string $key - * @param mixed $value - * @return void - */ - public function __set($key, $value) - { - $this->setAttribute($key, $value); - } - - /** - * Determine if the given attribute exists. - * - * @param mixed $offset - * @return bool - */ - public function offsetExists($offset) - { - return isset($this->$offset); - } - - /** - * Get the value for a given offset. - * - * @param mixed $offset - * @return mixed - */ - public function offsetGet($offset) - { - return $this->$offset; - } - - /** - * Set the value for a given offset. - * - * @param mixed $offset - * @param mixed $value - * @return void - */ - public function offsetSet($offset, $value) - { - $this->$offset = $value; - } - - /** - * Unset the value for a given offset. - * - * @param mixed $offset - * @return void - */ - public function offsetUnset($offset) - { - unset($this->$offset); - } - - /** - * Determine if an attribute exists on the model. - * - * @param string $key - * @return bool - */ - public function __isset($key) - { - return ((isset($this->attributes[$key]) || isset($this->relations[$key])) || - ($this->hasGetMutator($key) && ! is_null($this->getAttributeValue($key)))); - } - - /** - * Unset an attribute on the model. - * - * @param string $key - * @return void - */ - public function __unset($key) - { - unset($this->attributes[$key], $this->relations[$key]); - } - - /** - * Handle dynamic method calls into the method. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public function __call($method, $parameters) - { - if (in_array($method, array('increment', 'decrement'))) - { - return call_user_func_array(array($this, $method), $parameters); - } - - $query = $this->newQuery(); - - return call_user_func_array(array($query, $method), $parameters); - } - - /** - * Handle dynamic static method calls into the method. - * - * @param string $method - * @param array $parameters - * @return mixed - */ - public static function __callStatic($method, $parameters) - { - $instance = new static; - - return call_user_func_array(array($instance, $method), $parameters); - } - - /** - * Convert the model to its string representation. - * - * @return string - */ - public function __toString() - { - return $this->toJson(); - } - - /** - * When a model is being unserialized, check if it needs to be booted. - * - * @return void - */ - public function __wakeup() - { - $this->bootIfNotBooted(); - } - -}
http://git-wip-us.apache.org/repos/asf/airavata-php-gateway/blob/80fd786e/vendor/laravel/framework/src/Illuminate/Database/Eloquent/ModelNotFoundException.php ---------------------------------------------------------------------- diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/ModelNotFoundException.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/ModelNotFoundException.php deleted file mode 100755 index db98c25..0000000 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/ModelNotFoundException.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php namespace Illuminate\Database\Eloquent; - -class ModelNotFoundException extends \RuntimeException { - - /** - * Name of the affected Eloquent model. - * - * @var string - */ - protected $model; - - /** - * Set the affected Eloquent model. - * - * @param string $model - * @return $this - */ - public function setModel($model) - { - $this->model = $model; - - $this->message = "No query results for model [{$model}]."; - - return $this; - } - - /** - * Get the affected Eloquent model. - * - * @return string - */ - public function getModel() - { - return $this->model; - } - -} http://git-wip-us.apache.org/repos/asf/airavata-php-gateway/blob/80fd786e/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsTo.php ---------------------------------------------------------------------- diff --git a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsTo.php b/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsTo.php deleted file mode 100755 index 8cd1337..0000000 --- a/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/BelongsTo.php +++ /dev/null @@ -1,275 +0,0 @@ -<?php namespace Illuminate\Database\Eloquent\Relations; - -use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Query\Expression; -use Illuminate\Database\Eloquent\Collection; - -class BelongsTo extends Relation { - - /** - * The foreign key of the parent model. - * - * @var string - */ - protected $foreignKey; - - /** - * The associated key on the parent model. - * - * @var string - */ - protected $otherKey; - - /** - * The name of the relationship. - * - * @var string - */ - protected $relation; - - /** - * Create a new belongs to relationship instance. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param \Illuminate\Database\Eloquent\Model $parent - * @param string $foreignKey - * @param string $otherKey - * @param string $relation - * @return void - */ - public function __construct(Builder $query, Model $parent, $foreignKey, $otherKey, $relation) - { - $this->otherKey = $otherKey; - $this->relation = $relation; - $this->foreignKey = $foreignKey; - - parent::__construct($query, $parent); - } - - /** - * Get the results of the relationship. - * - * @return mixed - */ - public function getResults() - { - return $this->query->first(); - } - - /** - * Set the base constraints on the relation query. - * - * @return void - */ - public function addConstraints() - { - if (static::$constraints) - { - // For belongs to relationships, which are essentially the inverse of has one - // or has many relationships, we need to actually query on the primary key - // of the related models matching on the foreign key that's on a parent. - $table = $this->related->getTable(); - - $this->query->where($table.'.'.$this->otherKey, '=', $this->parent->{$this->foreignKey}); - } - } - - /** - * Add the constraints for a relationship count query. - * - * @param \Illuminate\Database\Eloquent\Builder $query - * @param \Illuminate\Database\Eloquent\Builder $parent - * @return \Illuminate\Database\Eloquent\Builder - */ - public function getRelationCountQuery(Builder $query, Builder $parent) - { - $query->select(new Expression('count(*)')); - - $otherKey = $this->wrap($query->getModel()->getTable().'.'.$this->otherKey); - - return $query->where($this->getQualifiedForeignKey(), '=', new Expression($otherKey)); - } - - /** - * Set the constraints for an eager load of the relation. - * - * @param array $models - * @return void - */ - public function addEagerConstraints(array $models) - { - // We'll grab the primary key name of the related models since it could be set to - // a non-standard name and not "id". We will then construct the constraint for - // our eagerly loading query so it returns the proper models from execution. - $key = $this->related->getTable().'.'.$this->otherKey; - - $this->query->whereIn($key, $this->getEagerModelKeys($models)); - } - - /** - * Gather the keys from an array of related models. - * - * @param array $models - * @return array - */ - protected function getEagerModelKeys(array $models) - { - $keys = array(); - - // First we need to gather all of the keys from the parent models so we know what - // to query for via the eager loading query. We will add them to an array then - // execute a "where in" statement to gather up all of those related records. - foreach ($models as $model) - { - if ( ! is_null($value = $model->{$this->foreignKey})) - { - $keys[] = $value; - } - } - - // If there are no keys that were not null we will just return an array with 0 in - // it so the query doesn't fail, but will not return any results, which should - // be what this developer is expecting in a case where this happens to them. - if (count($keys) == 0) - { - return array(0); - } - - return array_values(array_unique($keys)); - } - - /** - * Initialize the relation on a set of models. - * - * @param array $models - * @param string $relation - * @return array - */ - public function initRelation(array $models, $relation) - { - foreach ($models as $model) - { - $model->setRelation($relation, null); - } - - return $models; - } - - /** - * Match the eagerly loaded results to their parents. - * - * @param array $models - * @param \Illuminate\Database\Eloquent\Collection $results - * @param string $relation - * @return array - */ - public function match(array $models, Collection $results, $relation) - { - $foreign = $this->foreignKey; - - $other = $this->otherKey; - - // First we will get to build a dictionary of the child models by their primary - // key of the relationship, then we can easily match the children back onto - // the parents using that dictionary and the primary key of the children. - $dictionary = array(); - - foreach ($results as $result) - { - $dictionary[$result->getAttribute($other)] = $result; - } - - // Once we have the dictionary constructed, we can loop through all the parents - // and match back onto their children using these keys of the dictionary and - // the primary key of the children to map them onto the correct instances. - foreach ($models as $model) - { - if (isset($dictionary[$model->$foreign])) - { - $model->setRelation($relation, $dictionary[$model->$foreign]); - } - } - - return $models; - } - - /** - * Associate the model instance to the given parent. - * - * @param \Illuminate\Database\Eloquent\Model $model - * @return \Illuminate\Database\Eloquent\Model - */ - public function associate(Model $model) - { - $this->parent->setAttribute($this->foreignKey, $model->getAttribute($this->otherKey)); - - return $this->parent->setRelation($this->relation, $model); - } - - /** - * Dissociate previously associated model from the given parent. - * - * @return \Illuminate\Database\Eloquent\Model - */ - public function dissociate() - { - $this->parent->setAttribute($this->foreignKey, null); - - return $this->parent->setRelation($this->relation, null); - } - - /** - * Update the parent model on the relationship. - * - * @param array $attributes - * @return mixed - */ - public function update(array $attributes) - { - $instance = $this->getResults(); - - return $instance->fill($attributes)->save(); - } - - /** - * Get the foreign key of the relationship. - * - * @return string - */ - public function getForeignKey() - { - return $this->foreignKey; - } - - /** - * Get the fully qualified foreign key of the relationship. - * - * @return string - */ - public function getQualifiedForeignKey() - { - return $this->parent->getTable().'.'.$this->foreignKey; - } - - /** - * Get the associated key of the relationship. - * - * @return string - */ - public function getOtherKey() - { - return $this->otherKey; - } - - /** - * Get the fully qualified associated key of the relationship. - * - * @return string - */ - public function getQualifiedOtherKeyName() - { - return $this->related->getTable().'.'.$this->otherKey; - } - -}
