2012-04-06 11 views
14

Ich baue eine Abfrage mit einem JOIN. Dies ist das erste Mal, dass ich db-Sachen mit Active Record gemacht habe und ich habe ein bisschen einen Haken gefunden.CodeIgniter ActiveRecord Feldnamen in der JOIN-Anweisung

Ich möchte einen Tisch companies zum users Tabelle namens beitreten, so kann ich den Namen der Firma bekommen etc der Benutzer ist, ich habe wie so erfolgreich, diese Art von getan.

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; 
} 

jedoch Das Problem ist, dass die Felder in companies, sie sind id und name sind in diesem Objekt als einfach name zurückgegeben.

Normalerweise, wenn ich die rohe Abfrage schreiben würde, würde ich Aliase zu den Tabellen geben und das Ergebnis wäre etwa u.company_id, c.name. Ich würde also wissen, name hatte nichts mit dem Benutzer zu tun, aber natürlich ist der Name des Unternehmens. Und obwohl jetzt kein Problem, aber potenziell in der Zukunft, die id Spalte kann natürlich nicht in der Ergebnismenge koexistieren, so wird man überschrieben!

Wie können wir diese Art der Unterscheidung zwischen den Feldern erhalten, die von bestimmten Tabellen kommen? Oder gibt es eine bessere Möglichkeit, über Tabellenverknüpfungen zu arbeiten und mit verknüpften Abfragedatensätzen/-objekten zu arbeiten?

Edit:

Wenn ich es als eine rohe Abfrage tun würde ich tun:

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'; 

Das ist sehr gut, aber wenn ich versuche, dass ich in aktiver Datensatz zu tun rechnen, das ist ziemlich schlechte Praxis wenn es überhaupt funktioniert.

Antwort

36

Wenn Sie bestimmte Spalten aus der Tabelle auswählen möchten, verwenden Sie db->select(). Sie können Tabellen Alias ​​zuweisen, einige Bedingungen hinzufügen usw. Senden Sie den zweiten Parameter FALSE, um Sonderzeichen nicht zu entfernen.

$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

Ich dachte, ich müsste vielleicht darauf zurückgreifen, aber ich war nicht zuversichtlich, dass ich in der Lage wäre, so zu wählen. Wie gebe ich dann Aliase zu den Tabellen wie mein Beispiel, so etwas wie '-> get ('user AS u')'? Wäre das mit allen ActiveRecord-Datenbankzielen kompatibel? – deed02392

+0

@ deed02392 überprüfen, aktualisiert Code – safarov

+0

OK, das ist, wie ich dachte. Der "AS" -Operator ist Standard-SQL-Recht, setzt er den Alias ​​in allen db-Sprachen? Oder wird das nur in Zertifikaten funktionieren? – deed02392