/** * @brief Magic method override. * * @param string $name - method to call * @param array $arguments - parameters for method * @return mixed - instance of a ORM_Base derived class | array of ORM_Wrapper | unknown * @throws Exception - if unable to identify/locate the method $name */ public function __call($name, $arguments) { // One to many if (isset($this->_to_many[$name])) { // Return wrapper $return = new ORMWrapper(); // Get model records $prepare = self::$instance->prepare("SELECT * FROM `{$this->_to_many[$name]}` WHERE `{$this->_get_table_name()}_id` = :object_id"); if ($prepare->execute(array('object_id' => $this->_data["{$this->_get_table_name()}_id"]))) { $model_name = str_replace(' ', '_', ucwords(str_replace('_', ' ', $this->_to_many[$name]))); while ($data = $prepare->fetch(\PDO::FETCH_ASSOC)) { eval('$object = ' . $model_name . '::load(' . $data[$name . "_id"] . ', $data);'); $return->push($object); } } return $return; } // One to one if (isset($this->_to_one[$name])) { $model_name = str_replace(' ', '_', ucwords(str_replace('_', ' ', $this->_to_one[$name]))); eval('$return = ' . $model_name . '::load(' . $this->_data[$name . "_id"] . ');'); return $return; } throw new ORMException(ORM::$exception_strings[400], 400); }
/** * Factory method used to acquire instances of the given class. * The class name should be supplied as a string, and the class * should already have been loaded by PHP (or a suitable autoloader * should exist). This method actually returns a wrapped ORM object * which allows a database query to be built. The wrapped ORM object is * responsible for returning instances of the correct class when * its find_one or find_many methods are called. * * @param string $class_name * @param null|string $connection_name * @return ORMWrapper */ public static function factory($class_name, $connection_name = null) { $class_name = self::$auto_prefix_models . $class_name; $table_name = self::_get_table_name($class_name); if ($connection_name == null) { $connection_name = self::_get_static_property($class_name, '_connection_name', ORMWrapper::DEFAULT_CONNECTION); } $wrapper = ORMWrapper::for_table($table_name, $connection_name); $wrapper->set_class_name($class_name); $wrapper->use_id_column(self::_get_id_column_name($class_name)); return $wrapper; }
/** * @arg bool raw * if raw is true, relational fields are returned their ids. */ public function getRows($raw = false) { $rows = array(); foreach ($this->orm->find_many() as $row) { foreach ($this->fields as $field) { // skip the only non-readable field type: if (in_array($field['type'], array('file', 'file_multiple')) || !$field['read']) { continue; } if ($field['type'] == 'flag') { $map = array('No', 'Yes'); $rows[$row->id][$field['name']] = $raw ? $row->{$field}['name'] == '0' ? false : true : $map[$row->{$field}['name']]; continue; } if ($field['type'] != 'rel') { $rows[$row->id][$field['name']] = (string) $row->{$field}['name']; continue; } switch ($field['rel']['type']) { case 'belongs_to': case 'has_one': if ($raw) { if ($field['rel']['type'] == 'belongs_to') { $val = $row->{$field['rel']['key1']}; } else { if ($rel_obj = $row->{$field['rel']['relator_mtd']}()) { $val = $rel_obj->id; } else { $val = null; } } break; } if (!($rel_obj = $row->{$field['rel']['relator_mtd']}()) || !($val = $rel_obj->{$field['rel']['related_model_field']})) { $val = null; } break; case 'has_many': case 'has_many_through': if ($rel_obj = $row->{$field['rel']['relator_mtd']}()) { $all_related_values = $rel_obj->find_array(); } else { $val = null; break; } if ($raw) { $related_model_field = 'id'; } else { $related_model_field = $field['rel']['related_model_field']; } $val = array_map(function ($row) use($related_model_field) { return $row[$related_model_field]; }, $all_related_values); break; } $rows[$row->id][$field['name']] = $val; } $rows[$row->id] = self::applyCallbacks('pre_read', 1, $rows[$row->id], $this->fields); } return $rows; }
/** * Factory method used to acquire instances of the given class. * The class name should be supplied as a string, and the class * should already have been loaded by PHP (or a suitable autoloader * should exist). This method actually returns a wrapped ORM object * which allows a database query to be built. The wrapped ORM object is * responsible for returning instances of the correct class when * its find_one or find_many methods are called. */ public static function factory($class_name) { $table_name = self::_get_table_name($class_name); $wrapper = ORMWrapper::for_table($table_name); $wrapper->set_class_name($class_name); $wrapper->use_id_column(self::_get_id_column_name($class_name)); return $wrapper; }
/** * Magic function so that new operator works as expected */ public function __construct() { $class_name = get_class($this); $table_name = self::_get_table_name($class_name); parent::__construct($table_name); $this->set_class_name($class_name); $this->use_id_column(self::_id_column_name($class_name)); }