includes = func_get_args(); return $model; } /** * Get a model by the primary key. * * @param int $id * @return mixed */ public static function find($id) { return Eloquent\Factory::make(get_called_class())->where('id', '=', $id)->first(); } /** * Get an array of models from the database. * * @return array */ private function _get() { return Eloquent\Hydrate::from($this); } /** * Get the first model result * * @return mixed */ private function _first() { // ----------------------------------------------------- // Load the hydrated models. // ----------------------------------------------------- $results = Eloquent\Hydrate::from($this->take(1)); // ----------------------------------------------------- // Return the first result. // ----------------------------------------------------- if (count($results) > 0) { reset($results); return current($results); } } /** * Retrieve the query for a 1:1 relationship. * * @param string $model * @return mixed */ public function has_one($model) { return Eloquent\Relate::has_one($model, $this); } /** * Retrieve the query for a 1:* relationship. * * @param string $model * @return mixed */ public function has_many($model) { return Eloquent\Relate::has_many($model, $this); } /** * Retrieve the query for a 1:1 belonging relationship. * * @param string $model * @return mixed */ public function belongs_to($model) { // ----------------------------------------------------- // Get the calling function name. // ----------------------------------------------------- list(, $caller) = debug_backtrace(false); return Eloquent\Relate::belongs_to($caller, $model, $this); } /** * Retrieve the query for a *:* relationship. * * @param string $model * @return mixed */ public function has_many_and_belongs_to($model) { return Eloquent\Relate::has_many_and_belongs_to($model, $this); } /** * Save the model to the database. * * @return void */ public function save() { Eloquent\Warehouse::store($this); } /** * Magic method for retrieving model attributes. */ public function __get($key) { // ----------------------------------------------------- // Check the ignored attributes first. // ----------------------------------------------------- if (array_key_exists($key, $this->ignore)) { return $this->ignore[$key]; } // ----------------------------------------------------- // Is the attribute actually a relationship? // ----------------------------------------------------- if (method_exists($this, $key)) { // ----------------------------------------------------- // Get the query / model for the relationship. // ----------------------------------------------------- $model = $this->$key(); // ----------------------------------------------------- // Return the relationship results. // ----------------------------------------------------- return ($this->relating == 'has_one' or $this->relating == 'belongs_to') ? $this->ignore[$key] = $model->first() : $this->ignore[$key] = $model->get(); } // ----------------------------------------------------- // Check the "regular" attributes. // ----------------------------------------------------- return (array_key_exists($key, $this->attributes)) ? $this->attributes[$key] : null; } /** * Magic Method for setting model attributes. */ public function __set($key, $value) { // ----------------------------------------------------- // Is the key actually a relationship? // ----------------------------------------------------- if (method_exists($this, $key)) { $this->ignore[$key] = $value; } else { // ----------------------------------------------------- // Add the value to the attributes. // ----------------------------------------------------- $this->attributes[$key] = $value; $this->dirty[$key] = $value; } } /** * Magic Method for determining if a model attribute is set. */ public function __isset($key) { return (array_key_exists($key, $this->attributes) or array_key_exists($key, $this->ignore)); } /** * Magic Method for unsetting model attributes. */ public function __unset($key) { unset($this->attributes[$key]); unset($this->ignore[$key]); unset($this->dirty[$key]); } /** * Magic Method for handling dynamic method calls. */ public function __call($method, $parameters) { // ----------------------------------------------------- // Is the "get" method being called? // ----------------------------------------------------- if ($method == 'get') { return $this->_get(); } // ----------------------------------------------------- // Is the "first" method being called? // ----------------------------------------------------- if ($method == 'first') { return $this->_first(); } // ----------------------------------------------------- // If the method is an aggregate function, just return // the aggregate value from the query. // ----------------------------------------------------- if (in_array($method, array('count', 'sum', 'min', 'max', 'avg'))) { return call_user_func_array(array($this->query, $method), $parameters); } // ----------------------------------------------------- // Pass the method call to the query instance. // ----------------------------------------------------- call_user_func_array(array($this->query, $method), $parameters); return $this; } /** * Magic Method for handling dynamic static method calls. */ public static function __callStatic($method, $parameters) { // ----------------------------------------------------- // Create a new model instance. // ----------------------------------------------------- $model = Eloquent\Factory::make(get_called_class()); // ----------------------------------------------------- // Do we need to return the entire table? // ----------------------------------------------------- if ($method == 'get') { return $model->_get(); } // ----------------------------------------------------- // Do we need to return the first model from the table? // ----------------------------------------------------- if ($method == 'first') { return $model->_first(); } // ----------------------------------------------------- // If the method is an aggregate function, just return // the aggregate value from the query. // ----------------------------------------------------- if (in_array($method, array('count', 'sum', 'min', 'max', 'avg'))) { return call_user_func_array(array($model->query, $method), $parameters); } // ----------------------------------------------------- // Pass the method call to the query instance. // ----------------------------------------------------- call_user_func_array(array($model->query, $method), $parameters); return $model; } }