Example #1
0
 /**
  * 回调函数,用于分析查询中包含的关联表名称
  *
  * @param string $table_name
  *
  * @return string
  */
 function _parseTableName($table_name)
 {
     if (strpos($table_name, '.') !== false) {
         list($schema, $table_name) = explode('.', $table_name);
     } else {
         $schema = null;
     }
     if (is_null($this->_meta) || !isset($this->_meta->associations[$table_name])) {
         return $table_name;
     }
     $assoc = $this->_meta->getAssoc($table_name)->init();
     $target_table = $assoc->target_meta->table;
     if ($schema && $target_table->schema && $target_table->schema != $schema) {
         return "{$schema}.{$table_name}";
     }
     $assoc_table_name = $assoc->target_meta->table->getFullTableName();
     $current_table_name = $this->_getCurrentTableName();
     switch ($assoc->type) {
         case QDB::HAS_MANY:
         case QDB::HAS_ONE:
         case QDB::BELONGS_TO:
             $key = "{$assoc->type}-{$assoc_table_name}";
             if (!isset($this->_joined_tables[$key])) {
                 $this->joinInner($assoc_table_name, '', "{$assoc_table_name}.{$assoc->target_key} = " . "{$current_table_name}.{$assoc->source_key}");
                 $this->_joined_tables[$key] = true;
             }
             break;
         case QDB::MANY_TO_MANY:
             $mid_table_name = $assoc->mid_table->getFullTableName();
             $key = "{$assoc->type}-{$mid_table_name}";
             if (!isset($this->_joined_tables[$key])) {
                 $this->joinInner($mid_table_name, '', "{$mid_table_name}.{$assoc->mid_source_key} = " . "{$current_table_name}.{$assoc->source_key}");
                 $this->joinInner($assoc_table_name, '', "{$assoc_table_name}.{$assoc->target_key} = " . "{$mid_table_name}.{$assoc->mid_target_key}");
                 $this->_joined_tables[$key] = true;
             }
             break;
     }
     return $assoc_table_name;
 }