sql >> Databáze >  >> RDS >> Mysql

codeigniter aktivní záznamy spojit s pomocí?

Neexistuje žádná vestavěná podpora pro JOIN ... USING ve třídě aktivních záznamů. Nejlepší by bylo pravděpodobně změnit join() funkce je taková (soubor je system/database/DB_active_rec.php v případě, že nevíte)

public function join($table, $cond, $type = '')
{
    if ($type != '')
    {
        $type = strtoupper(trim($type));

        if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER')))
        {
            $type = '';
        }
        else
        {
            $type .= ' ';
        }
    }

    // Extract any aliases that might exist.  We use this information
    // in the _protect_identifiers to know whether to add a table prefix
    $this->_track_aliases($table);

    // Strip apart the condition and protect the identifiers
    if (preg_match('/([\w\.]+)([\W\s]+)(.+)/', $cond, $match))
    {
        $match[1] = $this->_protect_identifiers($match[1]);
        $match[3] = $this->_protect_identifiers($match[3]);

        $cond = $match[1].$match[2].$match[3];
    }

    // Assemble the JOIN statement
    $type.'JOIN '.$this->_protect_identifiers($table, TRUE, NULL, FALSE);

    $using_match = preg_match('/using[ (]/i', $cond);

    if ($using_match)
    {
        $join .= $cond;
    }
    else
    {
        $join .= ' ON '.$cond;
    }

    $this->ar_join[] = $join;
    if ($this->ar_caching === TRUE)
    {
        $this->ar_cache_join[] = $join;
        $this->ar_cache_exists[] = 'join';
    }

    return $this;
}

Takže to můžete jednoduše použít ve svém kódu join('table', 'USING ("something")')

I když možná budete chtít třídu rozšířit místo její úpravy, takže při upgradu CI nebudete muset dělat to samé znovu a znovu. Podívejte se na tento článek nebo tento (nebo hledejte na google), pokud to chcete udělat.

Nebo pokud se nechcete pouštět do všech těch problémů, můžete napsat jednoduchou pomocnou funkci, která umí to samé.

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

function join_using($table, $key) 
{
    $CI = get_instance();
    $join = 'JOIN '. $table .' USING (`'. $key .'`)';
    return $CI->db->ar_join[] = $join;
}  

Později stačí načíst pomocníka a zavolat funkci takto join_using('table', 'key') . Potom vytvoří stejný výsledek, jako byste vytvořili s původním join() kromě tohoto vám dá USING místo ON podmínka.

Například:

// $something1 and $something2 will produce the same result.
$something1 = $this->db->join('join_table', 'join_table.id = table.id')->get('table')->result();
print_r($something1);
join_using('join_table', 'id');
$something2 = $this->db->get('table')->result();
print_r($something2);



  1. doktrína - získat další a předchozí záznam

  2. Jak se připojit k MySQL pomocí UTF8 v perl skriptu?

  3. Jak mohu spočítat online uživatele ve své aplikaci?

  4. MySQL agreguje po měsících s průběžným součtem