_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; } } ?>