2012-04-06 28 views
14

Estoy creando una consulta que implica un JOIN. Esta es la primera vez que hago cosas de DB con Active Record y me he topado con un pequeño inconveniente.Nombres de campo de CodeIgniter ActiveRecord en la instrucción JOIN

Quiero unirme a una tabla llamada companies a la mesa users para que pueda obtener el nombre de la empresa, etc el usuario está en que he hecho este tipo de éxito, así:.

function get_profile_by_username($username) 
{ 
    $this->db->join('companies', $this->table_name.'.company_id = companies.id'); 
    $this->db->where('LOWER(username)=', strtolower($username)); 
    $query = $this->db->get($this->table_name); 
    if ($query->num_rows() == 1) return $query->row(); 
    return NULL; 
} 

Sin embargo el problema es que los campos en companies, son id y name se devuelven en ese objeto como simplemente llamado name.

Normalmente, cuando escribía la consulta sin formato, daba alias a las tablas y el resultado sería algo así como,, c.name. Así que sé que name no tiene nada que ver con el usuario, pero por supuesto es el nombre de la empresa. Y aunque no es un problema ahora, pero potencialmente en el futuro, obviamente la columna id no puede coexistir en el conjunto de resultados, por lo que se sobrescribe.

¿Cómo podemos obtener este tipo de diferenciación entre los campos que provienen de ciertas tablas? ¿O existe una forma mejor de abordar las combinaciones de tablas y trabajar con conjuntos de datos/objetos combinados?

Editar:

Si lo hacía como una consulta en bruto que haría:

SELECT u.id, u.username, c.name 
FROM users AS u 
JOIN companies AS c 
ON c.id = u.company_id 
WHERE u.username = 'foobar'; 

Cuál es grande, pero si trato de hacer eso en el registro activo Creo que es bastante mala práctica si funciona en absoluto

Respuesta

36

Si desea seleccionar algunas columnas específicas de la tabla, utilice db->select(). Puede dar un alias a las tablas, agregar algunas condiciones, etc. Enviar el segundo parámetro FALSE para no escapar caracteres especiales.

$this->db->select('u.id, u.username, c.name', false); 
$this->db->from('user as u'); 
$this->db->join('companies as c', 'u.company_id = c.id'); 
$this->db->where('LOWER(u.username)=', strtolower('foobar')); 
$query = $this->db->get(); 
+0

Pensé que tendría que recurrir a esto, pero no estaba seguro de poder seleccionar eso. ¿Cómo doy los alias a las tablas como mi ejemplo, algo así como '-> get ('user AS u')'? ¿Sería esto compatible con todos los objetivos de base de datos activerecord? – deed02392

+0

@ deed02392 comprobar, código actualizado – safarov

+0

OK, eso es lo que pensaba. El operador 'AS' es SQL estándar, ¿establece el alias en todos los lenguajes de db? O esto solo funcionará en certiain db's. – deed02392

Cuestiones relacionadas