Unir SQL en CodeIgniter con Active Record

Estoy tratando de entender esto, pero parece que voy en círculos. Estoy tratando de enumerar los temas de los usuarios uno por uno, con las citas que pertenecen a ese tema específico debajo. Si eso tiene sentido.

Tengo 3 tablas, así:

[USERS] user_id username

[TEMAS] topic_id user_id topic_name

[COTIZACIONES] quote_id topic_id quote_name

Quiero ser capaz de hacer algo como esto en mi opinión:

Nombre de usuario: Thomas

Tema 1: Lo que sea

Citas: una cita, otra cita y una tercera cita, todas ellas pertenecientes al tema 1.

Tema 2: Otro tema de Thomas

Citas: Sí, de hecho, está bien gracias, me encanta Stack Overflow, estas citas pertenecen al Tema 2.

Pero no puedo hacer que funcione, lo he intentado todo, incluso cosas raras como:

public function get_quotes() { $this->db->select('*'); $this->db->from('topics'); $this->db->join('quotes', 'topic_id = quote_id'); $query = $this->db->get(); if($query->num_rows() > 0) { foreach ($query->result() as $row) { $data[] = $row; } } return $data; } 

¿Es extraño, debería intentar usar ‘where’ en su lugar? Algo como:

 $this->db->where('user', $user_id); $this->db->where('topic', $topic_id); $this->db->where('quote', $quote_id); 

¡Realmente aprecio cualquier ayuda que pueda obtener, o simplemente un dedo que apunte en la dirección correcta!

Inmediatamente le preguntaría “¿Qué no está funcionando?” En segundo lugar, le sugiero que ejecute el generador de perfiles para mostrarle el SQL EXACTO que se está generando, para que pueda hacer una evaluación válida de dónde le está fallando el CONSENTIMIENTO ACTIVO .

Para usar el generador de perfiles, pegue esto en su controlador:

 $this->output->enable_profiler(TRUE); 

Dará como resultado una buena salida de todas las llamadas a bases de datos, todas las variables POST, etc.
Referencia aquí: http://codeigniter.com/user_guide/libraries/output.html

ACTUALIZAR

Para hacer completamente lo que desea, necesita una consulta que devuelva las siguientes columnas:

 user_id, username, topic_id, topic_name, quote_id, quote_name 

Aquí está la consulta activa que desea (también puede usar el método de encadenamiento si es lo suficientemente claro):

 $this->db->select('u.user_id, u.username, t.topic_id, t.topic_name, q.quote_id, q.quote_name'); $this->db->from('users u'); $this->db->join('topics t', 't.user_id = u.user_id'); // this joins the user table to topics $this->db->join('quotes q', 'q.topic_id = t.topic_id'); // this joins the quote table to the topics table $query = $this->db->get(); 

Su conjunto de resultados será algo así como:

 user_id | username | topic_id | topic_name | quote_id | quote_name 1 |Thomas |1 |Whatever |1 |One quote, anot... 2 |Ryan |4 |Another... |6 |To be or not to... 

Una vez que tenga ese conjunto de resultados, simplemente recorra los datos para emitirlo, y verifique si tiene varias citas de la misma persona (digamos ordenar por ID_usuario y hacer una prueba en el segundo bucle si es la misma persona, de lo contrario mostraría el nuevo nombre de usuario).

Si desea todas las cotizaciones para un usuario específico:

 $this->db->join('TOPICS t', 'u.user_id on t.user_id') ->join('QUOTES q', 't.topic_id on q.topic_id') ->where('u.user_id', $userId) ->get('USERS u'); // I always echo my queries when developing to make sure they are what i'm expecting echo $this->db->last_query(); 

Si quieres todas las cotizaciones para todos los usuarios

 $this->db->join('TOPICS t', 'u.user_id on t.user_id') ->join('QUOTES q', 't.topic_id on q.topic_id') ->get('USERS u'); echo $this->db->last_query();