Пример #1
0
	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);
	}
Пример #2
0
	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;
	}
Пример #3
0
	/**
	 * 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);
	}
Пример #4
0
	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));
	}