Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Aktywne rekordy codeigniter dołączyć za pomocą?

Nie ma wbudowanej obsługi JOIN ... USING w klasie active record. Twój najlepszy zakład prawdopodobnie zmieni join() funkcja taka jak ta (plik to system/database/DB_active_rec.php jeśli nie wiesz)

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

Więc możesz po prostu użyć tego w swoim kodzie join('table', 'USING ("something")')

Chociaż możesz chcieć rozszerzyć klasę zamiast modyfikować ją, aby nie trzeba było robić tego samego w kółko po uaktualnieniu CI. Spójrz na ten artykuł lub ten (lub wyszukaj google), jeśli chcesz to zrobić zamiast tego.

Lub jeśli nie chcesz sprawiać kłopotów, możesz napisać prostą funkcję pomocniczą, która zrobi to samo.

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

Później po prostu załaduj helper i wywołaj funkcję w ten sposób join_using('table', 'key') . Następnie da taki sam wynik, jak w przypadku oryginalnego join() z wyjątkiem tego da ci USING zamiast ON stan.

Na przykład:

// $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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP MYSQL :sposób na wyświetlenie tabeli w porządku rosnącym

  2. Blokowanie '0000-00-00' z pól daty MySQL

  3. MySQL/SQL:Aktualizacja ze skorelowanym podzapytaniem z samej zaktualizowanej tabeli

  4. Zapytanie MySQL — rekordy od dnia dzisiejszego do ostatnich 30 dni

  5. Dopasuj Regex w MySQL dla powtarzającego się słowa z warunkiem wykluczenia nawiasów