2012-04-03 5 views
1

Ich habe festgestellt, dass bei der Sortierung nach einer Datetime-Spalte in CI mit aktivem Datensatz die Spalte als String oder int behandelt wird.CI active record, escapes & order_by datetime spalte

Beispiel:

$this->db->limit(12); 
    $this->db->where('subscribed',1); 
    $this->db->join('profiles','profiles.user_id=users.id'); 
    $this->db->where('active',1); 
    $this->db->select('users.thumbUpload,users.vanity_url'); 
    $this->db->select('users.created_on as time'); 
    $this->db->order_by('time'); 
    $query = $this->db->get('users'); 

Dies ist, wo users.created_on ein Datetime-Feld ist. Erstens, ist es, weil der aktive Datensatz time entkommen ist, oder ist es etwas anderes? Und wenn es ist, kann ich das Entweichen auf order_by irgendwie verhindern?

Auch stackoverflow, bitte stoppen Autokorrektur "datetime" auf "Datum Zeit". Es ist nervig.

Prost!

Antwort

0

Wenn Sie das zweite Argument als false festlegen, wird die Funktion die Zeichenfolge nicht prüfen und nicht zurückgeben. Versuchen Sie, diese

$this->db->select('users.created_on as time', FALSE); 

Oder fragen Sie

$this->db->order_by('users.created_on', 'DESC'); //or ASC 

Und für komplexe verwenden abfragt

$this->db->query("query"); 
+1

Ja, es ist die order_by, die nicht in der Lage scheint, als falsch zu setzen. Gibt es einen Weg dahin, ohne das ganze Ding in db-> query ('foo') aufzulisten? –

+0

@MichaelWatson ja es ist. Für komplexe Abfragen, die Sie nicht verwenden können, verwenden Sie nur 'db-> query ('foo')' – safarov

+0

Versuchen Sie auch 'db-> order_by (users.created_on)' – safarov

0

Nach der Unterzeichnung des Verfahrens in Core-Dateien von CI (derzeit 2.2), es hat keine Option zu wählen, ob oder nicht zu entkommen.

// The original prototype of the order_by() 
public function order_by($orderby, $direction = '') { 
    // Definition 
} 

Wie Sie dort sehen, ist nicht Argument als $escape = true in der Argumentliste. Eine Möglichkeit, dies zu tun, ist hacken diese Kerndatei (ich normalerweise nicht vorschlagen, da, wenn Sie CI später auf eine neuere Version aktualisieren, dann werden diese Änderungen verloren gehen, aber wenn Sie nicht vorhaben, dies zu tun, es ist in Ordnung, es zu verwenden).

Um dies zu tun, zuerst als den Prototyp ändern:

public function order_by($orderby, $direction = '', $escape = true) { 
    // Definition 
} 

Und dann die Bedingungen in den folgenden Teilen der Definition überprüfen:

// Line 842 
if($escape){ 
    $part = $this->_protect_identifiers(trim($part)); 
}else { 
    $part = trim($part); 
} 

// Line 856 
if($escape){ 
    $orderby = $this->_protect_identifiers($orderby); 
}  

Wenn Sie es nennen, das Entkommen zu verhindern:

$this->db->order_by($ORDERBY_CLAUSE, null, false);