public function afterQuery(Atomik_Model_Builder $builder, Atomik_Model_Modelset $modelSet) { $modelName = $builder->name; $primaryKeyName = $builder->getPrimaryKeyField()->name; $manager = $builder->getManager(); $db = $manager->getDbInstance(); $rows = array(); $dataQuery = $db->q()->select() ->from($builder->tableName) ->where(array($primaryKeyName => null)); foreach ($modelSet as $row) { $primaryKey = $row[$primaryKeyName]; $key = $modelName . ':' . $primaryKey; if (($cached = $this->_memcache->get($key)) !== false) { // cache hit $rows[] = $cached; continue; } $data = $dataQuery->setParams(array($primaryKey))->execute()->fetch(); $this->_memcache->set($key, $data); $rows[] = $data; } $modelSet->setData($rows); }
public function export(Atomik_Model_Builder $builder) { $definition = new Atomik_Db_Definition($builder->getManager()->getDbInstance()); $definition->dropBeforeCreate(); $tableName = $builder->tableName; $table = $definition->table($tableName); foreach ($builder->getFields() as $field) { list($type, $length) = $field->getSqlType(); $column = $table->createColumn($field->name, $type, $length, $field->getOptions('sql-')); if ($builder->getPrimaryKeyField() == $field) { $table->primaryKey($field->name); $column->options['auto-increment'] = true; } if ($builder->isFieldPartOfReference($field)) { $table->index($field->name, $field->getOption('sql-index', null)); } } $builder->getBehaviourBroker()->notifyBeforeExport($builder, $definition); $sql = $definition->toSql(); $builder->getBehaviourBroker()->notifyAfterExport($builder, $sql); return $sql; }
/** * Returns reference fields depending on the type of reference * * @param Atomik_Model_Builder $builder * @param string $targetName * @param string $type * @return array array(sourceField, targetField) */ public static function getReferenceFields(Atomik_Model_Builder $builder, $targetName, $type) { $targetBuilder = self::_getBaseBuilder($targetName); if ($type == Atomik_Model_Builder_Reference::HAS_PARENT) { // targetModel.targetPrimaryKey = sourceModel.targetModel_targetPrimaryKey $targetField = $targetBuilder->getPrimaryKeyField()->name; $sourceField = strtolower($targetName) . '_' . $targetField; } else if ($type == Atomik_Model_Builder_Reference::HAS_ONE) { // targetModel.sourceModel_sourcePrimaryKey = sourceModel.sourcePrimaryKey $sourceField = $builder->getPrimaryKeyField()->name; $targetField = strtolower($builder->name) . '_' . $sourceField; } else { $targetBuilder = Atomik_Model_Builder_Factory::get($targetName); // HAS_MANY // searching through the target model references for one pointing back to this model $parentRefs = $targetBuilder->getReferences(); $found = false; foreach ($parentRefs as $parentRef) { if ($parentRef->isHasParent() && $parentRef->isTarget($builder->name)) { $sourceField = $parentRef->targetField; $targetField = $parentRef->sourceField; $found = true; break; } } if (!$found) { require_once 'Atomik/Model/Builder/Exception.php'; throw new Atomik_Model_Builder_Exception('No back reference in ' . $targetName . ' for ' . $builder->name); } } return array($sourceField, $targetField); }
public function afterDelete(Atomik_Model_Builder $builder, Atomik_Model $model) { $primaryKey = $model->getPrimaryKey(); $db = $builder->getManager()->getDbInstance(); $tableName = $builder->tableName; $foreignFieldName = $this->_prefix($tableName) . '_' . $builder->getPrimaryKeyField()->name; $tableName = $this->_suffix($tableName); $db->delete($tableName, array($foreignFieldName => $primaryKey)); }