All pastes #581527 Raw Edit

k4st

public php v1 · immutable
·published 2007-06-21 15:48 UTC
rendered paste body
<?phpclass FAModelDefinition {	var $_pk = 'id';	var $_table;	var $_fks = array();	var $_fields = array();	var $_rels = array();	var $_model;		function FAModelDefinition(&$model) {		$this->_model = &$model;	}		function &getFinder() {		$finder = &$this->_model->getFinder($this->getName());				return $finder;	}		function getForeignKey($table) {		return $this->_fks[$table];	}		function getName() {		return substr(get_class($this), 0, -10);	}		function getPrimaryKey() {		return $this->_pk;	}		function getRecordClass() {		$class = $this->getName() . 'Record';				if (!class_exists($class)) {			$class = 'FARecord';		}				return $class;	}		function getRecordSetClass() {		$class = $this->getName() . 'Iterator';				if (!class_exists($class)) {			$class = 'FARecordSet';		}				return $class;	}		function &getRelation($field) {		return $this->_rels[$field];	}		function getTable() {		return $this->_table;	}		function hasField($field, $type, $regex = '//') {		preg_match('~([a-z]+)(?:\(([0-9]+)\))?~i', $type, $matches);				switch ($matches[1]) {		case 'varchar':		case 'char': {				$type = 'string';				break;			}		default: {				$type = $matches[1];			}		}				$this->_fields[$field] = array($type, $regex);	}		/**	* @field	String	This is the key that is used to query the relation	* @table	String	This is the table we will are searching	* @join	String	The foreign key that holds the back reference to this table	*/	function hasMany($field, $table, $join) {		$join = explode('.', $join);				$fk_field = array_pop($join);		$fk_model = array_pop($join)			or $fk_model = $this->getName();				$right = &$this->_model->getTable($table);				$query = NULL;				if ($fk_model == $right->getName()) {			$right_table = $right->getTable();			$right_key = $right->getForeignKey($this->getName());						$select = "$right_table.*";			$from = "$right_table";			$where = "$right_table.$right_key=?";						$query = &new FASelectQuery($select, $from, $where);		}		else {			$middle = &$this->_model->getTable($fk_model);						if ($right->getForeignKey($fk_model)) {				$left_table = $this->getTable();				$left_pk = $this->getPrimaryKey();				$middle_table = $middle->getTable();				$middle_fk = $middle->getForeignKey($this->getName());				$middle_pk = $middle->getPrimaryKey();				$right_table = $right->getTable();				$right_fk = $right->getForeignKey($middle->getName());											$select = "$right_table.*";				$from = "$right_table";								$query = &new FASelectQuery($select, $from);				$query->addJoin($middle_table, "$middle_table.$middle_pk=$right_table.$right_fk");				$query->addJoin($left_table, "$left_table.$left_pk=$middle_table.$middle_fk");				$query->addWhere("$left_table.$left_pk=?");			}			elseif ($middle->getForeignKey($this->getName()) && $middle->getForeignKey($right->getName())) {				$left_table = $this->getTable();				$left_pk = $this->getPrimaryKey();				$middle_table = $middle->getTable();				$middle_fk_left = $middle->getForeignKey($this->getName());				$middle_fk_right = $middle->getForeignKey($right->getName());				$right_table = $right->getTable();				$right_pk = $right->getPrimaryKey();											$select = "$right_table.*";				$from = "$right_table";								$query = &new FASelectQuery($select, $from);				$query->addJoin($middle_table, "$middle_table.$middle_fk_right=$right_table.$right_pk");				$query->addJoin($left_table, "$left_table.$left_pk=$middle_table.$middle_fk_left");				$query->addWhere("$left_table.$left_pk=?");			}		}				if ($query != NULL) {			$this->_rels[$field] = &new FAPluralRelation($query, $right->getFinder());		}	}		function hasOne($field, $table, $join) {		$join = explode('.', $join);				$fk_field = array_pop($join);		$fk_model = array_pop($join)			or $fk_model = $this->getName();				$right = &$this->_model->getTable($table);				if ($fk_model == $this->getName()) {			$this->_fks[$right->getName()] = $fk_field;						$right_table = $right->getTable();			$right_pk = $right->getPrimaryKey();			$left_table = $this->getTable();			$left_fk = $this->getForeignKey($right->getName());			$left_pk = $this->getPrimaryKey();						$select = "$right_table.*";			$from = "$right_table";						$query = &new FASelectQuery($select, $from);			$query->addJoin($left_table, "$right_table.$right_pk=$left_table.$left_fk");			$query->addWhere("$left_table.$left_pk=?");		} else {			$right_table = $right->getTable();			$right_fk = $right->getForeignKey($this->getName());						$select = "$right_table.*";			$from = "$right_table";			$where = "$right_table.$right_fk=?";						$query = &new FASelectQuery($select, $from, $where);		}				if ($query != NULL) {			$this->_rels[$field] = &new FASingularRelation($query, $right->getFinder());		}	}		function init() {	}		function isRelation($field) {		return isset($this->_rels[$field]);	}		function prepareSelect(&$query) {	}		function setPrimaryKey($field) {		$this->_pk = $field;	}		function setTable($table) {		$this->_table = $table;	}		function setTypes(&$data) {		foreach ($data as $field => $value) {			if (isset($this->_fields[$field])) {				eval ('$data[$field] = (' . $this->_fields[$field][0] . ')$value;');			}		}	}		function validateField(&$field, $value) {		if (!isset($this->_fields[$field])) {			trigger_error("Field does not exist: " . $this->getTable() . ".$field", E_USER_NOTICE);						// Not a fatal error, dev's should pick this up			return TRUE;		}				$ret = TRUE;		eval ('$value = (' . $this->_fields[$field][0] . ')$value;');				if (!preg_match($this->_fields[$field][1], $value)) {			$ret = FALSE;		}				return $ret;	}}?>