/** * 回调函数,用于分析查询中包含的关联表名称 * * @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->assoc($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; }
/** * 回调函数,用于分析查询中包含的关联表名称 * * @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->assoc($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])) { // 支持额外join 条件设定,用于关联查询 $join_cond_extra = ''; if (isset($this->_meta->props[$assoc->mapping_name]['assoc_params']['join_cond_extra'])) { $join_cond_extra = " AND " . trim($this->_meta->props[$assoc->mapping_name]['assoc_params']['join_cond_extra']); } $this->joinInner($assoc_table_name, '', "[{$assoc_table_name}.{$assoc->target_key}] = " . "[{$current_table_name}.{$assoc->source_key}] {$join_cond_extra}"); $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; }