Mysql
 sql >> база данни >  >> RDS >> Mysql

codeigniter активните записи се присъединяват с помощта на?

Няма вградена поддръжка за JOIN ... USING в активния клас запис. Най-добрият ви залог вероятно ще промени join() функция да бъде такава (файлът е system/database/DB_active_rec.php в случай, че не знаете)

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

Така че можете просто да използвате това във вашия код join('table', 'USING ("something")')

Въпреки това, може да искате да разширите класа, вместо да го модифицирате, така че да не се налага да правите едно и също нещо отново и отново, когато надграждате своя CI. Разгледайте този статия или този (или потърсете в Google), ако искате да го направите вместо това.

Или ако не искате да се справяте с всички тези проблеми, можете да напишете проста помощна функция, която може да направи същото.

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

По-късно просто заредете помощника и извикайте функцията по този начин join_using('table', 'key') . След това ще даде същия резултат, както бихте направили с оригиналния join() освен че този ще ви даде USING вместо ON състояние.

Например:

// $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. Как да конвертирам зависима подзаявка в присъединяване за по-добра производителност?

  2. Актуализирайте стойност на колона до COUNT редове за конкретни стойности в същата таблица

  3. Контейнеризиране на Apache, MySQL и PHP с Docker

  4. Mysql подобно текстово търсене

  5. Mysql Не може да се осъществи връзка, защото целевата машина активно я отказва