активные записи codeigniter объединяются с помощью? - PullRequest
2 голосов
/ 11 сентября 2011

Я хочу написать этот запрос:

SELECT u.userId, uil.interestId, url.regionId FROM users u 
  JOIN userInterestLink uil USING (userId)
  JOIN userRegionLink url USING (userId)
  JOIN dealInterestLink dil USING (interestId)
  JOIN dealRegionLink drl USING (regionId, dealId)
WHERE dealId = 1

с использованием класса активных записей средства воспламенения кода, однако я не знаю, как это сделать JOIN ... USING

1 Ответ

3 голосов
/ 11 сентября 2011

Нет встроенной поддержки 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...