Modules

ORM
extends Gleez_ORM_Core
extends Model
extends Kohana_Model

Implements: Serializable

Object Relational Mapping (ORM) is a method of abstracting database access to standard PHP calls. All table rows are represented as model objects, with object properties representing row data. ORM in Kohana generally follows the Active Record pattern.

package
Gleez/ORM
author
Gleez Team
Kohana Team
copyright
© 2013 Gleez Team
© 2007-2010 Kohana Team
license
http://gleezcms.org/license
http://kohanaframework.org/license

Class declared in MODPATH/gleez/classes/orm.php on line 3.

Constants

Constants

DELETE

integer 5

Properties

protected array $_belongs_to

"Belongs to" relationships

protected bool $_cache

protected array $_cast_data

Data to be loaded into the model from a database call cast

protected array $_changed

protected static array $_column_cache

Stores column information for ORM models

array(0) 

protected string $_created_column

Auto-update columns for creation

protected object $_datatables

DataTables

protected Database $_db

Database Object

protected array $_db_applied

Database methods applied

protected Database_Query_Builder_Where $_db_builder

Database query builder

protected String $_db_group

Database config group

protected array $_db_pending

Database methods pending

protected bool $_db_reset

Reset builder

protected string $_errors_filename

The message filename used for validation errors. Defaults to ORM::$_object_name

protected string $_foreign_key_suffix

Foreign key suffix

protected array $_has_many

"Has many" relationships

protected array $_has_many_keys

"Many to many" relationships

protected array $_has_one

"Has one" relationships

protected array $_ignored_columns

Ignored columns

protected static array $_init_cache

Initialization storage for ORM models

array(0) 

protected array $_load_with

Relationships that should always be joined

protected bool $_loaded

protected array $_object

Current object

protected string $_object_name

Model name

protected string $_object_plural

Plural model name

protected array $_original_values

protected string $_primary_key

Table primary key

protected mixed $_primary_key_value

Primary key value

protected bool $_reload_on_wakeup

Model configuration, reload on wakeup?

protected bool $_saved

protected array $_serialize_columns

Auto-serialize and unserialize columns on get/set

protected array $_sorting

protected array $_table_columns

Table columns

protected string $_table_name

Table name

protected bool $_table_names_plural

Model configuration, table names plural?

protected bool $_updated

protected string $_updated_column

Auto-update columns for updates

protected bool $_valid

protected Validation $_validation

Validation object created before saving/updating

protected array $_with_applied

With calls already applied

Methods

public __construct( [ mixed $id = NULL ] ) (defined in Gleez_ORM_Core)

Constructs a new model and loads a record if given

Parameters

  • mixed $id = NULL - Parameter for find or object to load

Return Values

  • void

Source Code

public function __construct($id = NULL)
{
	$this->_initialize();

	if ($id !== NULL)
	{
		if (is_array($id))
		{
			foreach ($id as $column => $value)
			{
				// Passing an array of column => values
				$this->where($column, '=', $value);
			}

			$this->find();
		}
		else
		{
			// Passing the primary key
			$this->where($this->_object_name.'.'.$this->_primary_key, '=', $id)->find();
		}
	}
	elseif ( ! empty($this->_cast_data))
	{
		// Load preloaded data from a database call cast
		$this->_load_values($this->_cast_data);

		$this->_cast_data = array();
	}
}

public __get( string $column ) (defined in Gleez_ORM_Core)

Handles retrieval of all model values, relationships, and metadata.

Parameters

  • string $column required - Column name

Return Values

  • mixed

Source Code

public function __get($column)
{
	if (array_key_exists($column, $this->_object))
	{
		return (in_array($column, $this->_serialize_columns))
			? $this->_unserialize_value($this->_object[$column])
			: $this->_object[$column];
	}
	elseif (isset($this->_related[$column]))
	{
		// Return related model that has already been fetched
		return $this->_related[$column];
	}
	elseif (isset($this->_belongs_to[$column]))
	{
		$model = $this->_related($column);

		// Use this model's column and foreign model's primary key
		$col = $model->_object_name.'.'.$model->_primary_key;
		$val = $this->_object[$this->_belongs_to[$column]['foreign_key']];

		$model->where($col, '=', $val)->find();

		return $this->_related[$column] = $model;
	}
	elseif (isset($this->_has_one[$column]))
	{
		$model = $this->_related($column);

		// Use this model's primary key value and foreign model's column
		$col = $model->_object_name.'.'.$this->_has_one[$column]['foreign_key'];
		$val = $this->pk();

		// Make sure we don't run WHERE "AUTO_INCREMENT column" = NULL queries. This would
		// return the last inserted record instead of an empty result.
		// See: http://mysql.localhost.net.ar/doc/refman/5.1/en/server-session-variables.html#sysvar_sql_auto_is_null
		if ($val !== NULL)
		{
			$model->where($col, '=', $val)->find();
		}

		return $this->_related[$column] = $model;
	}
	elseif (isset($this->_has_many[$column]))
	{
		$model = ORM::factory($this->_has_many[$column]['model']);

		if (isset($this->_has_many[$column]['through']))
		{
			// Grab has_many "through" relationship table
			$through = $this->_has_many[$column]['through'];

			// Join on through model's target foreign key (far_key) and target model's primary key
			$join_col1 = $through.'.'.$this->_has_many[$column]['far_key'];
			$join_col2 = $model->_object_name.'.'.$model->_primary_key;

			$model->join($through)->on($join_col1, '=', $join_col2);

			// Through table's source foreign key (foreign_key) should be this model's primary key
			$col = $through.'.'.$this->_has_many[$column]['foreign_key'];
			$val = $this->pk();
		}
		else
		{
			// Simple has_many relationship, search where target model's foreign key is this model's primary key
			$col = $model->_object_name.'.'.$this->_has_many[$column]['foreign_key'];
			$val = $this->pk();
		}

		return $model->where($col, '=', $val);
	}
	elseif (isset($this->_has_many_keys[$column]))
	{
		$model = ORM::factory($this->_has_many_keys[$column]['model']);
		$far_key = $this->_has_many_keys[$column]['far_key'];
		
		foreach( $this->_has_many_keys[$column]['foreign_key'] as $fcol => $fvalue )
		{
			if( is_int($fcol) )
			{
				$fcol   = $fvalue;
				$fvalue = isset($far_key[$fcol]) ? $far_key[$fcol] : isset($this->$fcol) ? $this->$fcol : $this->pk();
			}
			
			$model->where($model->_object_name.'.'.$fcol, '=', $fvalue);
		}

		return $model;
	}
	else
	{
		throw new Kohana_Exception('The :property property does not exist in the :class class',
			array(':property' => $column, ':class' => get_class($this)));
	}
}

public __isset( string $column ) (defined in Gleez_ORM_Core)

Checks if object data is set.

Parameters

  • string $column required - Column name

Return Values

  • boolean

Source Code

public function __isset($column)
{
	return (isset($this->_object[$column]) OR
		isset($this->_related[$column]) OR
		isset($this->_has_one[$column]) OR
		isset($this->_belongs_to[$column]) OR
		isset($this->_has_many[$column]));
}

public __set( string $column , mixed $value ) (defined in Gleez_ORM_Core)

Base set method - this should not be overridden.

Parameters

  • string $column required - Column name
  • mixed $value required - Column value

Return Values

  • void

Source Code

public function __set($column, $value)
{
	if ( ! isset($this->_object_name))
	{
		// Object not yet constructed, so we're loading data from a database call cast
		$this->_cast_data[$column] = $value;
	}
	else
	{
		// Set the model's column to given value
		$this->set($column, $value);
	}
}

public __toString( ) (defined in Gleez_ORM_Core)

Displays the primary key of a model when it is converted to a string.

Return Values

  • string

Source Code

public function __toString()
{
	return (string) $this->pk();
}

public __unset( string $column ) (defined in Gleez_ORM_Core)

Unsets object data.

Parameters

  • string $column required - Column name

Return Values

  • void

Source Code

public function __unset($column)
{
	unset($this->_object[$column], $this->_changed[$column], $this->_related[$column]);
}

public add( string $alias , mixed $far_keys [, array $data = NULL ] ) (defined in Gleez_ORM_Core)

Adds a new relationship to between this model and another.

// Add the login role using a model instance
$model->add('roles', ORM::factory('role', array('name' => 'login')));
// Add the login role if you know the roles.id is 5
$model->add('roles', 5);
// Add multiple roles (for example, from checkboxes on a form)
$model->add('roles', array(1, 2, 3, 4));

Parameters

  • string $alias required - Alias of the has_many "through" relationship
  • mixed $far_keys required - Related model, primary key, or an array of primary keys
  • array $data = NULL - Additional data to store in "through"/pivot table

Return Values

  • ORM

Source Code

public function add($alias, $far_keys, $data = NULL)
{
	$far_keys = ($far_keys instanceof ORM) ? $far_keys->pk() : $far_keys;

	$columns = array($this->_has_many[$alias]['foreign_key'], $this->_has_many[$alias]['far_key']);
	$foreign_key = $this->pk();

	if ($data !== NULL)
	{
		// Additional data stored in pivot table
		$columns = array_merge($columns, array_keys($data));
	}

	$query = DB::insert($this->_has_many[$alias]['through'], $columns);

	foreach ( (array) $far_keys as $key)
	{
		$values = array($foreign_key, $key);
		if ($data !== NULL)
		{
			// Additional data stored in pivot table
			$values  = array_merge($values, array_values($data));
		}
		
		$query->values($values);
	}

	$query->execute($this->_db);

	return $this;
}

public and_having( mixed $column , string $op [, mixed $value = NULL ] ) (defined in Gleez_ORM_Core)

Creates a new "AND HAVING" condition for the query.

Parameters

  • mixed $column required - Column name or array($column, $alias) or object
  • string $op required - Logic operator
  • mixed $value = NULL - Column value

Return Values

  • $this

Source Code

public function and_having($column, $op, $value = NULL)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'and_having',
		'args' => array($column, $op, $value),
	);

	return $this;
}

public and_having_close( ) (defined in Gleez_ORM_Core)

Closes an open "AND HAVING (...)" grouping.

Return Values

  • $this

Source Code

public function and_having_close()
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'and_having_close',
		'args' => array(),
	);

	return $this;
}

public and_having_open( ) (defined in Gleez_ORM_Core)

Opens a new "AND HAVING (...)" grouping.

Return Values

  • $this

Source Code

public function and_having_open()
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'and_having_open',
		'args' => array(),
	);

	return $this;
}

public and_where( mixed $column , string $op , mixed $value ) (defined in Gleez_ORM_Core)

Creates a new "AND WHERE" condition for the query.

Parameters

  • mixed $column required - Column name or array($column, $alias) or object
  • string $op required - Logic operator
  • mixed $value required - Column value

Return Values

  • $this

Source Code

public function and_where($column, $op, $value)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'and_where',
		'args' => array($column, $op, $value),
	);

	return $this;
}

public and_where_close( ) (defined in Gleez_ORM_Core)

Closes an open "AND WHERE (...)" grouping.

Return Values

  • $this

Source Code

public function and_where_close()
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'and_where_close',
		'args' => array(),
	);

	return $this;
}

public and_where_open( ) (defined in Gleez_ORM_Core)

Opens a new "AND WHERE (...)" grouping.

Return Values

  • $this

Source Code

public function and_where_open()
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'and_where_open',
		'args' => array(),
	);

	return $this;
}

public as_array( ) (defined in Gleez_ORM_Core)

Returns the values of this object as an array, including any related one-one models that have already been loaded using with()

Return Values

  • array

Source Code

public function as_array()
{
	$object = array();
	$extra = array('url', 'edit_url', 'delete_url');

	foreach ($this->_object as $column => $value)
	{
		// Call __get for any user processing
		$object[$column] = $this->__get($column);
	}

	foreach ($this->_related as $column => $model)
	{
		// Include any related objects that are already loaded
		$object[$column] = $model->as_array();
	}

	foreach ($extra as $column)
	{
		try
		{
			// Call __get for any user processing
			$object[$column] = $this->__get($column);
		}catch(Exception $e){}
	}

	return $object;
}

public belongs_to( ) (defined in Gleez_ORM_Core)

Source Code

public function belongs_to()
{
	return $this->_belongs_to;
}

public cached( [ integer $lifetime = NULL ] ) (defined in Gleez_ORM_Core)

Enables the query to be cached for a specified amount of time.

Parameters

  • integer $lifetime = NULL - Number of seconds to cache

Tags

Return Values

  • $this

Source Code

public function cached($lifetime = NULL)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'cached',
		'args' => array($lifetime),
	);

	return $this;
}

public changed( [ string $field = NULL ] ) (defined in Gleez_ORM_Core)

Check whether the model data has been modified. If $field is specified, checks whether that field was modified.

Parameters

  • string $field = NULL - Field to check for changes

Return Values

  • bool - Whether or not the field has changed

Source Code

public function changed($field = NULL)
{
	return ($field === NULL)
		? $this->_changed
		: Arr::get($this->_changed, $field);
}

public check( [ Validation $extra_validation = NULL ] ) (defined in Gleez_ORM_Core)

Validates the current model's data

Parameters

  • Validation $extra_validation = NULL - Validation object

Return Values

  • ORM

Source Code

public function check(Validation $extra_validation = NULL)
{
	// Determine if any external validation failed
	$extra_errors = ($extra_validation AND ! $extra_validation->check());

	// Always build a new validation object
	$this->_validation();

               // add custom rules to $this->_validation();
	Module::event($this->_object_name .'_validation', $this->_validation, $extra_errors);
       
	$array = $this->_validation;

	if (($this->_valid = $array->check()) === FALSE OR $extra_errors)
	{
		$exception = new ORM_Validation_Exception($this->errors_filename(), $array);

		if ($extra_errors)
		{
			// Merge any possible errors from the external object
			$exception->add_object('_external', $extra_validation);
		}
		$this->_validation = NULL; //Fixed memory leak @http://dev.kohanaframework.org/issues/4286
		throw $exception;
	}

	$this->_validation = NULL; //Fixed memory leak @http://dev.kohanaframework.org/issues/4286
	return $this;
}

public clear( ) (defined in Gleez_ORM_Core)

Unloads the current object and clears the status.

Tags

  • Chainable -

Return Values

  • ORM

Source Code

public function clear()
{
	// Create an array with all the columns set to NULL
	$values = array_combine(array_keys($this->_table_columns), array_fill(0, count($this->_table_columns), NULL));

	// Replace the object and reset the object status
	$this->_object = $this->_changed = $this->_related = $this->_original_values = array();

	// Replace the current object with an empty one
	$this->_load_values($values);

	// Reset primary key
	$this->_primary_key_value = NULL;

	$this->reset();

	return $this;
}

public count_all( ) (defined in Gleez_ORM_Core)

Count the number of records in the table.

Return Values

  • integer

Source Code

public function count_all()
{
	$selects = array();

	foreach ($this->_db_pending as $key => $method)
	{
		if ($method['name'] == 'select')
		{
			// Ignore any selected columns for now
			$selects[] = $method;
			unset($this->_db_pending[$key]);
		}
		elseif ($method['name'] == 'order_by')
		{
			// Also, ignore order clause
			$order_by[$key] = $method; // Fix of the fix here!
			unset($this->_db_pending[$key]);
		}
	}

	if ( ! empty($this->_load_with))
	{
		foreach ($this->_load_with as $alias)
		{
			// Bind relationship
			$this->with($alias);
		}
	}

	$this->_build(Database::SELECT);

	$records = $this->_db_builder->from(array($this->_table_name, $this->_object_name))
		->select(array('COUNT("*")', 'records_found'))
		->execute($this->_db)
		->get('records_found');

	// Add back in selected columns
	//$this->_db_pending += $selects;
	$this->_db_pending = array_merge($this->_db_pending, $selects);

	if( isset($order_by) )
	{
		// Add back in order_by clause
		//$this->_db_pending += $order_by;
		$this->_db_pending = array_merge($this->_db_pending, $order_by);
	}

	$this->reset();

	// Return the total number of records in a table
	return $records;
}

public create( [ Validation $validation = NULL ] ) (defined in Gleez_ORM_Core)

Insert a new object to the database added event support

Parameters

  • Validation $validation = NULL - Validation object

Return Values

  • ORM

Source Code

public function create(Validation $validation = NULL)
{
	if ($this->_loaded)
		throw new Kohana_Exception('Cannot create :model model because it is already loaded.', array(':model' => $this->_object_name));

               Module::event($this->_object_name .'_prevalid', $this, $validation);
       
	// Require model validation before saving
	if ( ! $this->_valid OR $validation)
	{
		$this->check($validation);
	}

	$this->before_save();
               Module::event($this->_object_name .'_presave', $this, $validation);

	$data = array();
	foreach ($this->_changed as $column)
	{
		// Generate list of column => values
		$data[$column] = $this->_object[$column];
	}

	if (is_array($this->_created_column))
	{
		// Fill the created column
		$column = $this->_created_column['column'];
		$format = $this->_created_column['format'];

		$data[$column] = $this->_object[$column] = ($format === TRUE) ? time() : date($format);
	}

	$result = DB::insert($this->_table_name)
		->columns(array_keys($data))
		->values(array_values($data))
		->execute($this->_db);

	if ( ! array_key_exists($this->_primary_key, $data))
	{
		// Load the insert id as the primary key if it was left out
		$this->_object[$this->_primary_key] = $this->_primary_key_value = $result[0];
	}

	// Object is now loaded and saved
	$this->_loaded = $this->_saved = TRUE;

	// All changes have been saved
	$this->_changed = array();
	$this->_original_values = $this->_object;

	$this->after_save();
               Module::event($this->_object_name .'_save', $this);

	return $this;
}

public created_column( ) (defined in Gleez_ORM_Core)

Source Code

public function created_column()
{
	return $this->_created_column;
}

public dataTables( ) (defined in Gleez_ORM_Core)

Setter/Getter for jquery DataTables support

Return Values

  • object - DataTables

Source Code

public function dataTables(array $columns = NULL)
{
	if ( ! empty($columns) )
	{
		$this->_datatables = DataTables::factory($this)->columns($columns)->execute();
	}
	
	return $this->_datatables;
}

public delete( ) (defined in Gleez_ORM_Core)

Deletes a single record or multiple records, ignoring relationships.

Tags

  • Chainable -

Return Values

  • ORM

Source Code

public function delete()
{
	if ( ! $this->_loaded)
		throw new Kohana_Exception('Cannot delete :model model because it is not loaded.', array(':model' => $this->_object_name));

	// Use primary key value
	$id = $this->pk();

	$this->before_delete($id);
               Module::event($this->_object_name .'_predelete', $this);

	// Delete the object
	DB::delete($this->_table_name)
		->where($this->_primary_key, '=', $id)
		->execute($this->_db);

	$this->after_delete($id);
               Module::event($this->_object_name .'_delete', $this);
       
	return $this->clear();
}

public delete_all( ) (defined in Gleez_ORM_Core)

Delete all objects in the associated table. This does NOT destroy relationships that have been created with other objects.

Tags

  • Chainable -

Return Values

  • ORM

Source Code

public function delete_all()
{
	if ( $this->_loaded)
		throw new Kohana_Exception('Cannot delete all :model model because it is loaded.', array(':model' => $this->_object_name));
       
               Module::event($this->_object_name .'_pre_delete_all', $this);
       
	$this->_build(ORM::DELETE);
	$this->_db_builder->execute($this->_db);

               Module::event($this->_object_name .'_delete_all', $this);
       
	return $this->clear();
}

public distinct( boolean $value ) (defined in Gleez_ORM_Core)

Enables or disables selecting only unique columns using "SELECT DISTINCT"

Parameters

  • boolean $value required - Enable or disable distinct columns

Return Values

  • $this

Source Code

public function distinct($value)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'distinct',
		'args' => array($value),
	);

	return $this;
}

public errors_filename( ) (defined in Gleez_ORM_Core)

Source Code

public function errors_filename()
{
	return $this->_errors_filename;
}

public static factory( string $model [, mixed $id = NULL ] ) (defined in Gleez_ORM_Core)

Creates and returns a new model.

Parameters

  • string $model required - Model name
  • mixed $id = NULL - Parameter for find()

Tags

  • Chainable -

Return Values

  • ORM

Source Code

public static function factory($model, $id = NULL)
{
	// Set class name
	$model = 'Model_'.ucfirst($model);

	return new $model($id);
}

public filters( ) (defined in Gleez_ORM_Core)

Filter definitions for validation

Return Values

  • array

Source Code

public function filters()
{
	return array();
}

public find( ) (defined in Gleez_ORM_Core)

Finds and loads a single database row into the object.

Tags

  • Chainable -

Return Values

  • ORM

Source Code

public function find()
{
	if ($this->_loaded)
		throw new Kohana_Exception('Method find() cannot be called on loaded objects');

	if ( ! empty($this->_load_with))
	{
		foreach ($this->_load_with as $alias)
		{
			// Bind auto relationships
			$this->with($alias);
		}
	}

	$this->_build(Database::SELECT);

	return $this->_load_result(FALSE);
}

public find_all( ) (defined in Gleez_ORM_Core)

Finds multiple database rows and returns an iterator of the rows found.

Return Values

  • Database_Result

Source Code

public function find_all()
{
	if ($this->_loaded)
		throw new Kohana_Exception('Method find_all() cannot be called on loaded objects');

	if ( ! empty($this->_load_with))
	{
		foreach ($this->_load_with as $alias)
		{
			// Bind auto relationships
			$this->with($alias);
		}
	}

	$this->_build(Database::SELECT);

	return $this->_load_result(TRUE);
}

public find_or_create( array $values ) (defined in Gleez_ORM_Core)

Finds or creates a model instance with the given values

Parameters

  • array $values required - $values

Tags

Return Values

  • $this

Source Code

public function find_or_create($values)
{
	// Unload any previously loaded objects
	$this->clear();

	// Attempt to find the object
	foreach ($values as $key => $value)
	{
	    $this->where($key, '=', $value);
	}
	
	$found = $this->find()->loaded();
	
	if ($found)
	{
	    return $this;
	}
	else
	{
	    $this->values($values);
	    $s = $this->save();
	    return $s;
	}
}

public from( mixed $tables ) (defined in Gleez_ORM_Core)

Choose the tables to select "FROM ..."

Parameters

  • mixed $tables required - Table name or array($table, $alias) or object

Return Values

  • $this

Source Code

public function from($tables)
{
	$tables = func_get_args();

	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'from',
		'args' => $tables,
	);

	return $this;
}

public group_by( mixed $columns ) (defined in Gleez_ORM_Core)

Creates a "GROUP BY ..." filter.

Parameters

  • mixed $columns required - Column name or array($column, $alias) or object

Return Values

  • $this

Source Code

public function group_by($columns)
{
	$columns = func_get_args();

	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'group_by',
		'args' => $columns,
	);

	return $this;
}

public has( string $alias [, mixed $far_keys = NULL ] ) (defined in Gleez_ORM_Core)

Tests if this object has a relationship to a different model, or an array of different models.

// Check if $model has the login role
$model->has('roles', ORM::factory('role', array('name' => 'login')));
// Check for the login role if you know the roles.id is 5
$model->has('roles', 5);
// Check for all of the following roles
$model->has('roles', array(1, 2, 3, 4));
// Check if $model has any roles
$model->has('roles')

Parameters

  • string $alias required - Alias of the has_many "through" relationship
  • mixed $far_keys = NULL - Related model, primary key, or an array of primary keys

Return Values

  • Database_Result

Source Code

public function has($alias, $far_keys = NULL)
{
	if ($far_keys === NULL)
	{
		return (bool) DB::select(array('COUNT("*")', 'records_found'))
			->from($this->_has_many[$alias]['through'])
			->where($this->_has_many[$alias]['foreign_key'], '=', $this->pk())
			->execute($this->_db)->get('records_found');
	}

	$far_keys = ($far_keys instanceof ORM) ? $far_keys->pk() : $far_keys;

	// We need an array to simplify the logic
	$far_keys = (array) $far_keys;

	// Nothing to check if the model isn't loaded or we don't have any far_keys
	if ( ! $far_keys OR ! $this->_loaded)
		return FALSE;

	$count = (int) DB::select(array('COUNT("*")', 'records_found'))
		->from($this->_has_many[$alias]['through'])
		->where($this->_has_many[$alias]['foreign_key'], '=', $this->pk())
		->where($this->_has_many[$alias]['far_key'], 'IN', $far_keys)
		->execute($this->_db)->get('records_found');

	// Rows found need to match the rows searched
	return $count === count($far_keys);
}

public has_many( ) (defined in Gleez_ORM_Core)

Source Code

public function has_many()
{
	return $this->_has_many;
}

public has_many_keys( ) (defined in Gleez_ORM_Core)

Source Code

public function has_many_keys()
{
	return $this->_has_many_keys;
}

public has_one( ) (defined in Gleez_ORM_Core)

Source Code

public function has_one()
{
	return $this->_has_one;
}

public having( mixed $column , string $op [, mixed $value = NULL ] ) (defined in Gleez_ORM_Core)

Alias of and_having()

Parameters

  • mixed $column required - Column name or array($column, $alias) or object
  • string $op required - Logic operator
  • mixed $value = NULL - Column value

Return Values

  • $this

Source Code

public function having($column, $op, $value = NULL)
{
	return $this->and_having($column, $op, $value);
}

public having_close( ) (defined in Gleez_ORM_Core)

Closes an open "AND HAVING (...)" grouping.

Return Values

  • $this

Source Code

public function having_close()
{
	return $this->and_having_close();
}

public having_open( ) (defined in Gleez_ORM_Core)

Alias of and_having_open()

Return Values

  • $this

Source Code

public function having_open()
{
	return $this->and_having_open();
}

public join( mixed $table [, string $type = NULL ] ) (defined in Gleez_ORM_Core)

Adds addition tables to "JOIN ...".

Parameters

  • mixed $table required - Column name or array($column, $alias) or object
  • string $type = NULL - Join type (LEFT, RIGHT, INNER, etc)

Return Values

  • $this

Source Code

public function join($table, $type = NULL)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'join',
		'args' => array($table, $type),
	);

	return $this;
}

public labels( ) (defined in Gleez_ORM_Core)

Label definitions for validation

Return Values

  • array

Source Code

public function labels()
{
	return array();
}

public last_query( ) (defined in Gleez_ORM_Core)

Returns last executed query

Return Values

  • string

Source Code

public function last_query()
{
	return $this->_db->last_query;
}

public limit( integer $number ) (defined in Gleez_ORM_Core)

Return up to "LIMIT ..." results

Parameters

  • integer $number required - Maximum results to return

Return Values

  • $this

Source Code

public function limit($number)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'limit',
		'args' => array($number),
	);

	return $this;
}

public list_columns( ) (defined in Gleez_ORM_Core)

Proxy method to Database list_columns.

Return Values

  • array

Source Code

public function list_columns()
{
	// Proxy to database
	return $this->_db->list_columns($this->_table_name);
}

public load_with( ) (defined in Gleez_ORM_Core)

Source Code

public function load_with()
{
	return $this->_load_with;
}

public loaded( ) (defined in Gleez_ORM_Core)

Source Code

public function loaded()
{
	return $this->_loaded;
}

public my_on( mixed $c1 , string $op , mixed $c2 ) (defined in Gleez_ORM_Core)

Adds "ON ..." conditions for the last created JOIN statement.

Parameters

  • mixed $c1 required - Column name or array($column, $alias) or object
  • string $op required - Logic operator
  • mixed $c2 required - Column name or array($column, $alias) or object

Return Values

  • $this

Source Code

public function my_on($c1, $op, $c2)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'join_and',
		'args' => array($c1, $op, $c2),
	);

	return $this;
}

public object( ) (defined in Gleez_ORM_Core)

Source Code

public function object()
{
	return $this->_object;
}

public object_name( ) (defined in Gleez_ORM_Core)

Source Code

public function object_name()
{
	return $this->_object_name;
}

public object_plural( ) (defined in Gleez_ORM_Core)

Source Code

public function object_plural()
{
	return $this->_object_plural;
}

public offset( integer $number ) (defined in Gleez_ORM_Core)

Start returning results after "OFFSET ..."

Parameters

  • integer $number required - Starting result number

Return Values

  • $this

Source Code

public function offset($number)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'offset',
		'args' => array($number),
	);

	return $this;
}

public on( mixed $c1 , string $op , mixed $c2 ) (defined in Gleez_ORM_Core)

Adds "ON ..." conditions for the last created JOIN statement.

Parameters

  • mixed $c1 required - Column name or array($column, $alias) or object
  • string $op required - Logic operator
  • mixed $c2 required - Column name or array($column, $alias) or object

Return Values

  • $this

Source Code

public function on($c1, $op, $c2)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'on',
		'args' => array($c1, $op, $c2),
	);

	return $this;
}

public or_having( mixed $column , string $op [, mixed $value = NULL ] ) (defined in Gleez_ORM_Core)

Creates a new "OR HAVING" condition for the query.

Parameters

  • mixed $column required - Column name or array($column, $alias) or object
  • string $op required - Logic operator
  • mixed $value = NULL - Column value

Return Values

  • $this

Source Code

public function or_having($column, $op, $value = NULL)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'or_having',
		'args' => array($column, $op, $value),
	);

	return $this;
}

public or_having_close( ) (defined in Gleez_ORM_Core)

Closes an open "OR HAVING (...)" grouping.

Return Values

  • $this

Source Code

public function or_having_close()
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'or_having_close',
		'args' => array(),
	);

	return $this;
}

public or_having_open( ) (defined in Gleez_ORM_Core)

Opens a new "OR HAVING (...)" grouping.

Return Values

  • $this

Source Code

public function or_having_open()
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'or_having_open',
		'args' => array(),
	);

	return $this;
}

public or_where( mixed $column , string $op , mixed $value ) (defined in Gleez_ORM_Core)

Creates a new "OR WHERE" condition for the query.

Parameters

  • mixed $column required - Column name or array($column, $alias) or object
  • string $op required - Logic operator
  • mixed $value required - Column value

Return Values

  • $this

Source Code

public function or_where($column, $op, $value)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'or_where',
		'args' => array($column, $op, $value),
	);

	return $this;
}

public or_where_close( ) (defined in Gleez_ORM_Core)

Closes an open "OR WHERE (...)" grouping.

Return Values

  • $this

Source Code

public function or_where_close()
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'or_where_close',
		'args' => array(),
	);

	return $this;
}

public or_where_open( ) (defined in Gleez_ORM_Core)

Opens a new "OR WHERE (...)" grouping.

Return Values

  • $this

Source Code

public function or_where_open()
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'or_where_open',
		'args' => array(),
	);

	return $this;
}

public order_by( mixed $column [, string $direction = NULL ] ) (defined in Gleez_ORM_Core)

Applies sorting with "ORDER BY ..."

Parameters

  • mixed $column required - Column name or array($column, $alias) or object
  • string $direction = NULL - Direction of sorting

Return Values

  • $this

Source Code

public function order_by($column, $direction = NULL)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'order_by',
		'args' => array($column, $direction),
	);

	return $this;
}

public original_values( ) (defined in Gleez_ORM_Core)

Source Code

public function original_values()
{
	return $this->_original_values;
}

public param( string $param , mixed $value ) (defined in Gleez_ORM_Core)

Set the value of a parameter in the query.

Parameters

  • string $param required - Parameter key to replace
  • mixed $value required - Value to use

Return Values

  • $this

Source Code

public function param($param, $value)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'param',
		'args' => array($param, $value),
	);

	return $this;
}

public pk( ) (defined in Gleez_ORM_Core)

Returns the value of the primary key

Return Values

  • mixed - Primary key

Source Code

public function pk()
{
	return $this->_primary_key_value;
}

public primary_key( ) (defined in Gleez_ORM_Core)

Source Code

public function primary_key()
{
	return $this->_primary_key;
}

public reload( ) (defined in Gleez_ORM_Core)

Reloads the current object from the database.

Tags

  • Chainable -

Return Values

  • ORM

Source Code

public function reload()
{
	$primary_key = $this->pk();

	// Replace the object and reset the object status
	$this->_object = $this->_changed = $this->_related = $this->_original_values = array();

	// Only reload the object if we have one to reload
	if ($this->_loaded)
		return $this->clear()
			->where($this->_object_name.'.'.$this->_primary_key, '=', $primary_key)
			->find();
	else
		return $this->clear();
}

public reload_columns( [ boolean $force = bool FALSE ] ) (defined in Gleez_ORM_Core)

Reload column definitions.

Parameters

  • boolean $force = bool FALSE - Force reloading

Tags

  • Chainable -

Return Values

  • ORM

Source Code

public function reload_columns($force = FALSE)
{
	if ($force === TRUE OR empty($this->_table_columns))
	{
		if (isset(ORM::$_column_cache[$this->_object_name]))
		{
			// Use cached column information
			$this->_table_columns = ORM::$_column_cache[$this->_object_name];
		}
		else
		{
			// Grab column information from database
			$this->_table_columns = $this->list_columns(TRUE);

			// Load column cache
			ORM::$_column_cache[$this->_object_name] = $this->_table_columns;
		}
	}

	return $this;
}

public remove( string $alias [, mixed $far_keys = NULL ] ) (defined in Gleez_ORM_Core)

Removes a relationship between this model and another.

// Remove a role using a model instance
$model->remove('roles', ORM::factory('role', array('name' => 'login')));
// Remove the role knowing the primary key
$model->remove('roles', 5);
// Remove multiple roles (for example, from checkboxes on a form)
$model->remove('roles', array(1, 2, 3, 4));
// Remove all related roles
$model->remove('roles');

Parameters

  • string $alias required - Alias of the has_many "through" relationship
  • mixed $far_keys = NULL - Related model, primary key, or an array of primary keys

Return Values

  • ORM

Source Code

public function remove($alias, $far_keys = NULL)
{
	$far_keys = ($far_keys instanceof ORM) ? $far_keys->pk() : $far_keys;

	$query = DB::delete($this->_has_many[$alias]['through'])
		->where($this->_has_many[$alias]['foreign_key'], '=', $this->pk());

	if ($far_keys !== NULL)
	{
		// Remove all the relationships in the array
		$query->where($this->_has_many[$alias]['far_key'], 'IN', (array) $far_keys);
	}

	$query->execute($this->_db);

	return $this;
}

public reset( [ bool $next = bool TRUE ] ) (defined in Gleez_ORM_Core)

Clears query builder. Passing FALSE is useful to keep the existing query conditions for another query.

Parameters

  • bool $next = bool TRUE - Pass FALSE to avoid resetting on the next call

Return Values

  • ORM

Source Code

public function reset($next = TRUE)
{
	if ($next AND $this->_db_reset)
	{
		$this->_db_pending   = array();
		$this->_db_applied   = array();
		$this->_db_builder   = NULL;
		$this->_with_applied = array();
	}

	// Reset on the next call?
	$this->_db_reset = $next;

	return $this;
}

public rules( ) (defined in Gleez_ORM_Core)

Rule definitions for validation

Return Values

  • array

Source Code

public function rules()
{
	return array();
}

public save( [ Validation $validation = NULL ] ) (defined in Gleez_ORM_Core)

Updates or Creates the record depending on loaded()

Parameters

  • Validation $validation = NULL - Validation object

Tags

  • Chainable -

Return Values

  • ORM

Source Code

public function save(Validation $validation = NULL)
{
	return $this->loaded() ? $this->update($validation) : $this->create($validation);
}

public saved( ) (defined in Gleez_ORM_Core)

Source Code

public function saved()
{
	return $this->_saved;
}

public select( [ mixed $columns = NULL ] ) (defined in Gleez_ORM_Core)

Choose the columns to select from.

Parameters

  • mixed $columns = NULL - Column name or array($column, $alias) or object

Return Values

  • $this

Source Code

public function select($columns = NULL)
{
	$columns = func_get_args();

	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'select',
		'args' => $columns,
	);

	return $this;
}

public serialize( ) (defined in Gleez_ORM_Core)

Allows serialization of only the object data and state, to prevent "stale" objects being unserialized, which also requires less memory.

Return Values

  • array

Source Code

public function serialize()
{
	// Store only information about the object
	foreach (array('_primary_key_value', '_object', '_changed', '_loaded', '_saved', '_sorting', '_original_values', '_ignored_columns') as $var)
	{
		$data[$var] = $this->{$var};
	}

	return serialize($data);
}

public set( string $column , mixed $value ) (defined in Gleez_ORM_Core)

Handles setting of column

Parameters

  • string $column required - Column name
  • mixed $value required - Column value

Return Values

  • void

Source Code

public function set($column, $value)
{
               if ( ! isset($this->_object_name))
               {
                       // Object not yet constructed, so we're loading data from a database call cast
                       $this->_cast_data[$column] = $value;
                       
                       return $this;
               }
       
	if (in_array($column, $this->_serialize_columns))
	{
		$value = $this->_serialize_value($value);
	}

	if (array_key_exists($column, $this->_ignored_columns))
	{
		// No processing for ignored columns, just store it
		$this->_object[$column] = $value;
	}
	elseif (array_key_exists($column, $this->_object))
	{
		// Filter the data
		$value = $this->run_filter($column, $value);

		// See if the data really changed
		if ($value !== $this->_object[$column])
		{
			$this->_object[$column] = $value;

			// Data has changed
			$this->_changed[$column] = $column;

			// Object is no longer saved or valid
			$this->_saved = $this->_valid = FALSE;
		}
	}
	elseif (isset($this->_belongs_to[$column]))
	{
		// Update related object itself
		$this->_related[$column] = $value;

		// Update the foreign key of this model
		$this->_object[$this->_belongs_to[$column]['foreign_key']] = $value->pk();

		$this->_changed[$column] = $this->_belongs_to[$column]['foreign_key'];
	}
	else
	{
		throw new Kohana_Exception('The :property: property does not exist in the :class: class',
			array(':property:' => $column, ':class:' => get_class($this)));
	}

	return $this;
}

public table_columns( ) (defined in Gleez_ORM_Core)

Source Code

public function table_columns()
{
	return $this->_table_columns;
}

public table_name( ) (defined in Gleez_ORM_Core)

Source Code

public function table_name()
{
	return $this->_table_name;
}

public unique( string $field , mixed $value ) (defined in Gleez_ORM_Core)

Checks whether a column value is unique. Excludes itself if loaded.

Parameters

  • string $field required - The field to check for uniqueness
  • mixed $value required - The value to check for uniqueness

Return Values

  • bool - Whteher the value is unique

Source Code

public function unique($field, $value)
{
	$model = ORM::factory($this->object_name())
		->where($field, '=', $value)
		->find();

	if ($this->loaded())
	{
		return ( ! ($model->loaded() AND $model->pk() != $this->pk()));
	}

	return ( ! $model->loaded());
}

public unserialize( string $data ) (defined in Gleez_ORM_Core)

Prepares the database connection and reloads the object.

Parameters

  • string $data required - String for unserialization

Return Values

  • void

Source Code

public function unserialize($data)
{
	// Initialize model
	$this->_initialize();

	foreach (unserialize($data) as $name => $var)
	{
		$this->{$name} = $var;
	}

	if ($this->_reload_on_wakeup === TRUE)
	{
		// Reload the object
		$this->reload();
	}
}

public update( [ Validation $validation = NULL ] ) (defined in Gleez_ORM_Core)

Updates a single record or multiple records, added event support

Parameters

  • Validation $validation = NULL - Validation object

Tags

  • Chainable -

Return Values

  • ORM

Source Code

public function update(Validation $validation = NULL)
{
	if ( ! $this->_loaded)
		throw new Kohana_Exception('Cannot update :model model because it is not loaded.', array(':model' => $this->_object_name));

	Module::event($this->_object_name .'_prevalid', $this, $validation);

	// Run validation if the model isn't valid or we have additional validation rules.
	if ( ! $this->_valid OR $validation)
	{
		$this->check($validation);
	}

	if (empty($this->_changed))
	{
		return $this;
	}

	$this->before_save();
               Module::event($this->_object_name .'_presave', $this, $validation);

	$data = array();
	foreach ($this->_changed as $column)
	{
		// Compile changed data
		$data[$column] = $this->_object[$column];
	}

	if (is_array($this->_updated_column))
	{
		// Fill the updated column
		$column = $this->_updated_column['column'];
		$format = $this->_updated_column['format'];

		$data[$column] = $this->_object[$column] = ($format === TRUE) ? time() : date($format);
	}

	// Use primary key value
	$id = $this->pk();

	// Update a single record
	DB::update($this->_table_name)
		->set($data)
		->where($this->_primary_key, '=', $id)
		->execute($this->_db);

	if (isset($data[$this->_primary_key]))
	{
		// Primary key was changed, reflect it
		$this->_primary_key_value = $data[$this->_primary_key];
	}

	// Object has been saved
	$this->_saved  = $this->_updated = TRUE;

	// All changes have been saved
	$this->_changed = array();
	$this->_original_values = $this->_object;

	$this->after_save();
               Module::event($this->_object_name .'_save', $this);

	return $this;
}

public updated( ) (defined in Gleez_ORM_Core)

Source Code

public function updated()
{
	return $this->_updated;
}

public updated_column( ) (defined in Gleez_ORM_Core)

Source Code

public function updated_column()
{
	return $this->_updated_column;
}

public using( string $columns ) (defined in Gleez_ORM_Core)

Adds "USING ..." conditions for the last created JOIN statement.

Parameters

  • string $columns required - Column name

Return Values

  • $this

Source Code

public function using($columns)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'using',
		'args' => array($columns),
	);

	return $this;
}

public validation( ) (defined in Gleez_ORM_Core)

Source Code

public function validation()
{
	if ( ! isset($this->_validation))
	{
		// Initialize the validation object
		$this->_validation();
	}

	return $this->_validation;
}

public values( array $values [, array $expected = NULL ] ) (defined in Gleez_ORM_Core)

Set values from an array with support for one-one relationships. This method should be used for loading in post data, etc.

Parameters

  • array $values required - Array of column => val
  • array $expected = NULL - Array of keys to take from $values

Return Values

  • ORM

Source Code

public function values(array $values, array $expected = NULL)
{
	// Default to expecting everything except the primary key
	if ($expected === NULL)
	{
		$expected = array_keys($this->_table_columns);

		// Don't set the primary key by default
		unset($values[$this->_primary_key]);
	}
       
               if ( ! empty($this->_ignored_columns) )
	{
		// merge the columns needed to process
		$expected = array_merge($expected, array_keys($this->_ignored_columns) );
	}
       
	foreach ($expected as $key => $column)
	{
		if (is_string($key))
		{
			// isset() fails when the value is NULL (we want it to pass)
			if ( ! array_key_exists($key, $values))
				continue;

			// Try to set values to a related model
			$this->{$key}->values($values[$key], $column);
		}
		else
		{
			// isset() fails when the value is NULL (we want it to pass)
			if ( ! array_key_exists($column, $values))
				continue;

			// Update the column, respects __set()
			$this->$column = $values[$column];
		}
	}

	return $this;
}

public where( mixed $column , string $op , mixed $value ) (defined in Gleez_ORM_Core)

Alias of and_where()

Parameters

  • mixed $column required - Column name or array($column, $alias) or object
  • string $op required - Logic operator
  • mixed $value required - Column value

Return Values

  • $this

Source Code

public function where($column, $op, $value)
{
	// Add pending database call which is executed after query type is determined
	$this->_db_pending[] = array(
		'name' => 'where',
		'args' => array($column, $op, $value),
	);

	return $this;
}

public where_close( ) (defined in Gleez_ORM_Core)

Closes an open "AND WHERE (...)" grouping.

Return Values

  • $this

Source Code

public function where_close()
{
	return $this->and_where_close();
}

public where_open( ) (defined in Gleez_ORM_Core)

Alias of and_where_open()

Return Values

  • $this

Source Code

public function where_open()
{
	return $this->and_where_open();
}

public with( string $target_path ) (defined in Gleez_ORM_Core)

Binds another one-to-one object to this model. One-to-one objects can be nested using 'object1:object2' syntax

Parameters

  • string $target_path required - Target model to bind to

Return Values

  • void

Source Code

public function with($target_path)
{
	if (isset($this->_with_applied[$target_path]))
	{
		// Don't join anything already joined
		return $this;
	}

	// Split object parts
	$aliases = explode(':', $target_path);
	$target = $this;
	foreach ($aliases as $alias)
	{
		// Go down the line of objects to find the given target
		$parent = $target;
		$target = $parent->_related($alias);

		if ( ! $target)
		{
			// Can't find related object
			return $this;
		}
	}

	// Target alias is at the end
	$target_alias = $alias;

	// Pop-off top alias to get the parent path (user:photo:tag becomes user:photo - the parent table prefix)
	array_pop($aliases);
	$parent_path = implode(':', $aliases);

	if (empty($parent_path))
	{
		// Use this table name itself for the parent path
		$parent_path = $this->_object_name;
	}
	else
	{
		if ( ! isset($this->_with_applied[$parent_path]))
		{
			// If the parent path hasn't been joined yet, do it first (otherwise LEFT JOINs fail)
			$this->with($parent_path);
		}
	}

	// Add to with_applied to prevent duplicate joins
	$this->_with_applied[$target_path] = TRUE;

	// Use the keys of the empty object to determine the columns
	foreach (array_keys($target->_object) as $column)
	{
		$name = $target_path.'.'.$column;
		$alias = $target_path.':'.$column;

		// Add the prefix so that load_result can determine the relationship
		$this->select(array($name, $alias));
	}

	if (isset($parent->_belongs_to[$target_alias]))
	{
		// Parent belongs_to target, use target's primary key and parent's foreign key
		$join_col1 = $target_path.'.'.$target->_primary_key;
		$join_col2 = $parent_path.'.'.$parent->_belongs_to[$target_alias]['foreign_key'];
	}
	else
	{
		// Parent has_one target, use parent's primary key as target's foreign key
		$join_col1 = $parent_path.'.'.$parent->_primary_key;
		$join_col2 = $target_path.'.'.$parent->_has_one[$target_alias]['foreign_key'];
	}

	// Join the related object into the result
	$this->join(array($target->_table_name, $target_path), 'LEFT')->on($join_col1, '=', $join_col2);

	return $this;
}

protected _build( integer $type ) (defined in Gleez_ORM_Core)

Initializes the Database Builder to given query type

Parameters

  • integer $type required - Type of Database query

Return Values

  • ORM

Source Code

protected function _build($type)
{
	// Construct new builder object based on query type
	switch ($type)
	{
		case Database::SELECT:
			$this->_db_builder = DB::select();
		break;
		case Database::UPDATE:
			$this->_db_builder = DB::update(array($this->_table_name, $this->_object_name));
		break;
		case Database::DELETE:
			$this->_db_builder = DB::delete(array($this->_table_name, $this->_object_name));
		break;
		case ORM::DELETE:
			$this->_db_builder = DB::delete($this->_table_name);
	}

	// Process pending database method calls
	foreach ($this->_db_pending as $method)
	{
		$name = $method['name'];
		$args = $method['args'];

		$this->_db_applied[$name] = $name;

		call_user_func_array(array($this->_db_builder, $name), $args);
	}

	return $this;
}

protected _build_select( ) (defined in Gleez_ORM_Core)

Returns an array of columns to include in the select query. This method can be overridden to change the default select behavior.

Return Values

  • array - Columns to select

Source Code

protected function _build_select()
{
        $columns = array();
        
        foreach ($this->_table_columns as $column => $_)
        {
        $columns[] = array($this->_object_name.'.'.$column, $column);
        }
        
        return $columns;
}

protected _initialize( ) (defined in Gleez_ORM_Core)

Prepares the model database connection, determines the table name, and loads column information.

Return Values

  • void

Source Code

protected function _initialize()
{
	// Set the object name and plural name
	$this->_object_name = strtolower(substr(get_class($this), 6));

	// Check if this model has already been initialized
	if ( ! $init = Arr::get(ORM::$_init_cache, $this->_object_name, FALSE))
	{
		$init = array(
			'_belongs_to'     => array(),
			'_has_one'        => array(),
			'_has_many'   	  => array(),
			'_has_many_keys'  => array(),
		);

		// Set the object plural name if none predefined
		if ( ! isset($this->_object_plural))
		{
			$init['_object_plural'] = Inflector::plural($this->_object_name);
		}

		if ( ! $this->_errors_filename)
		{
			$init['_errors_filename'] = $this->_object_name;
		}

		if ( ! is_object($this->_db))
		{
			// Get database instance
			$init['_db'] = Database::instance($this->_db_group);
		}

		if (empty($this->_table_name))
		{
			// Table name is the same as the object name
			$init['_table_name'] = $this->_object_name;

			if ($this->_table_names_plural === TRUE)
			{
				// Make the table name plural
				$init['_table_name'] = Arr::get($init, '_object_plural', $this->_object_plural);
			}
		}

		if ( ! empty($this->_ignored_columns))
		{
			// Optimize for performance
			$init['_ignored_columns']= array_combine($this->_ignored_columns, $this->_ignored_columns);
		}

		$defaults = array();

		foreach ($this->_belongs_to as $alias => $details)
		{
			$defaults['model'] = $alias;
			$defaults['foreign_key'] = $alias.$this->_foreign_key_suffix;

			$init['_belongs_to'][$alias] = array_merge($defaults, $details);
		}

		foreach ($this->_has_one as $alias => $details)
		{
			$defaults['model'] = $alias;
			$defaults['foreign_key'] = $this->_object_name.$this->_foreign_key_suffix;

			$init['_has_one'][$alias] = array_merge($defaults, $details);
		}

		foreach ($this->_has_many as $alias => $details)
		{
			$defaults['model'] = Inflector::singular($alias);
			$defaults['foreign_key'] = $this->_object_name.$this->_foreign_key_suffix;
			$defaults['through'] = NULL;
			$defaults['far_key'] = Inflector::singular($alias).$this->_foreign_key_suffix;
		
			$init['_has_many'][$alias] = array_merge($defaults, $details);
		}

		foreach ($this->_has_many_keys as $alias => $details)
		{
			$defaults['model'] = Inflector::singular($alias);
			$defaults['foreign_key'] = array($this->_object_name.$this->_foreign_key_suffix);
			$defaults['far_key'] = array(Inflector::singular($alias).$this->_foreign_key_suffix);
		
			$init['_has_many_keys'][$alias] = array_merge($defaults, $details);
		}
		
		ORM::$_init_cache[$this->_object_name] = $init;
	}

	// Assign initialized properties to the current object
	foreach ($init as $property => $value)
	{
		$this->{$property} = $value;
	}

	// Load column information
	$this->reload_columns();

	// Clear initial model state
	$this->clear();
}

protected _load_result( [ bool $multiple = bool FALSE ] ) (defined in Gleez_ORM_Core)

Loads a database result, either as a new record for this model, or as an iterator for multiple rows.

Parameters

  • bool $multiple = bool FALSE - Return an iterator or load a single row

Tags

  • Chainable -

Return Values

  • ORM|Database_Result

Source Code

protected function _load_result($multiple = FALSE)
{
	$this->_db_builder->from(array($this->_table_name, $this->_object_name));

	if ($multiple === FALSE)
	{
		// Only fetch 1 record
		$this->_db_builder->limit(1);
	}

	// Select all columns by default
	$this->_db_builder->select($this->_object_name.'.*');

	if ( ! isset($this->_db_applied['order_by']) AND ! empty($this->_sorting))
	{
		foreach ($this->_sorting as $column => $direction)
		{
			if (strpos($column, '.') === FALSE)
			{
				// Sorting column for use in JOINs
				$column = $this->_object_name.'.'.$column;
			}

			$this->_db_builder->order_by($column, $direction);
		}
	}

	if ($multiple === TRUE)
	{
		// Return database iterator casting to this object type
		$result = $this->_db_builder->as_object(get_class($this))->execute($this->_db);

		$this->reset();

		return $result;
	}
	else
	{
		// Load the result as an associative array
		$result = $this->_db_builder->as_assoc()->execute($this->_db);

		$this->reset();

		if ($result->count() === 1)
		{
			// Load object values
			$this->_load_values($result->current());
		}
		else
		{
			// Clear the object, nothing was found
			$this->clear();
		}

		return $this;
	}
}

protected _load_values( array $values ) (defined in Gleez_ORM_Core)

Loads an array of values into into the current object.

Parameters

  • array $values required - Values to load

Tags

  • Chainable -

Return Values

  • ORM

Source Code

protected function _load_values(array $values)
{
	if (array_key_exists($this->_primary_key, $values))
	{
		if ($values[$this->_primary_key] !== NULL)
		{
			// Flag as loaded and valid
			$this->_loaded = $this->_valid = TRUE;

			// Store primary key
			$this->_primary_key_value = $values[$this->_primary_key];
		}
		else
		{
			// Not loaded or valid
			$this->_loaded = $this->_valid = FALSE;
		}
	}

	// Related objects
	$related = array();

	foreach ($values as $column => $value)
	{
		if (strpos($column, ':') === FALSE)
		{
			// Load the value to this model
			$this->_object[$column] = $value;
		}
		else
		{
			// Column belongs to a related model
			list ($prefix, $column) = explode(':', $column, 2);

			$related[$prefix][$column] = $value;
		}
	}

	if ( ! empty($related))
	{
		foreach ($related as $object => $values)
		{
			// Load the related objects with the values in the result
			$this->_related($object)->_load_values($values);
		}
	}

	if ($this->_loaded)
	{
		// Store the object in its original state
		$this->_original_values = $this->_object;
	}

	return $this;
}

Returns an ORM model for the given one-one related alias

Parameters

  • string $alias required - Alias name

Return Values

  • ORM

Source Code

protected function _related($alias)
{
	if (isset($this->_related[$alias]))
	{
		return $this->_related[$alias];
	}
	elseif (isset($this->_has_one[$alias]))
	{
		return $this->_related[$alias] = ORM::factory($this->_has_one[$alias]['model']);
	}
	elseif (isset($this->_belongs_to[$alias]))
	{
		return $this->_related[$alias] = ORM::factory($this->_belongs_to[$alias]['model']);
	}
	else
	{
		return FALSE;
	}
}

protected _serialize_value( ) (defined in Gleez_ORM_Core)

Source Code

protected function _serialize_value($value)
{
	return json_encode($value);
}

protected _unserialize_value( ) (defined in Gleez_ORM_Core)

Source Code

protected function _unserialize_value($value)
{
	return json_decode($value);
}

protected _validation( ) (defined in Gleez_ORM_Core)

Initializes validation rules, and labels

Return Values

  • void

Source Code

protected function _validation()
{
	// Build the validation object with its rules
	$this->_validation = Validation::factory($this->_object)
		->bind(':model', $this)
		->bind(':original_values', $this->_original_values)
		->bind(':changed', $this->_changed);

	foreach ($this->rules() as $field => $rules)
	{
		$this->_validation->rules($field, $rules);
	}

	// Use column names by default for labels
	$columns = array_keys($this->_table_columns);

	// Merge user-defined labels
	$labels = array_merge(array_combine($columns, $columns), $this->labels());

	foreach ($labels as $field => $label)
	{
		$this->_validation->label($field, $label);
	}
}

protected after_delete( ) (defined in Gleez_ORM_Core)

Override this method to take actions after the document is deleted

Source Code

protected function after_delete($id){}

protected after_load( ) (defined in Gleez_ORM_Core)

Override this method to take actions after the values are loaded

Source Code

protected function after_load(){}

protected after_save( ) (defined in Gleez_ORM_Core)

Override this method to take actions after data is saved

Source Code

protected function after_save(){}

protected before_delete( ) (defined in Gleez_ORM_Core)

Override this method to take actions before the document is deleted

Source Code

protected function before_delete($id){}

protected before_load( ) (defined in Gleez_ORM_Core)

Override this method to take actions before the values are loaded

Source Code

protected function before_load(){}

protected before_save( ) (defined in Gleez_ORM_Core)

Override this method to take certain actions before the data is saved

Source Code

protected function before_save(){}

protected run_filter( string $field , string $value ) (defined in Gleez_ORM_Core)

Filters a value for a specific column

Parameters

  • string $field required - The column name
  • string $value required - The value to filter

Return Values

  • string

Source Code

protected function run_filter($field, $value)
{
	$filters = $this->filters();

	// Get the filters for this column
	$wildcards = empty($filters[TRUE]) ? array() : $filters[TRUE];

	// Merge in the wildcards
	$filters = empty($filters[$field]) ? $wildcards : array_merge($wildcards, $filters[$field]);

	// Bind the field name and model so they can be used in the filter method
	$_bound = array
	(
		':field' => $field,
		':model' => $this,
	);

	foreach ($filters as $array)
	{
		// Value needs to be bound inside the loop so we are always using the
		// version that was modified by the filters that already ran
		$_bound[':value'] = $value;

		// Filters are defined as array($filter, $params)
		$filter = $array[0];
		$params = Arr::get($array, 1, array(':value'));

		foreach ($params as $key => $param)
		{
			if (is_string($param) AND array_key_exists($param, $_bound))
			{
				// Replace with bound value
				$params[$key] = $_bound[$param];
			}
		}

		if (is_array($filter) OR ! is_string($filter))
		{
			// This is either a callback as an array or a lambda
			$value = call_user_func_array($filter, $params);
		}
		elseif (strpos($filter, '::') === FALSE)
		{
			// Use a function call
			$function = new ReflectionFunction($filter);

			// Call $function($this[$field], $param, ...) with Reflection
			$value = $function->invokeArgs($params);
		}
		else
		{
			// Split the class and method of the rule
			list($class, $method) = explode('::', $filter, 2);

			// Use a static method call
			$method = new ReflectionMethod($class, $method);

			// Call $Class::$method($this[$field], $param, ...) with Reflection
			$value = $method->invokeArgs(NULL, $params);
		}
	}

	return $value;
}
Documentation comments powered by Disqus