CodeIgniter/PHP/MySQL: получение данных с помощью JOIN

Я новичок в PHP/MySQL и супер-новичок в CodeIgniter. У меня есть информация во многих таблицах MySQL. Я хочу получить его с помощью JOIN, где первичные ключи таблиц равны $variable... Как я могу это сделать и получить все поля без поля первичного ключа???

Что я делаю сейчас, так это (здесь только две таблицы):

function getAll($id) {

    $this->db->select('*');
    $this->db->from('movies');
    $this->db->join('posters', 'movies.id= posters.id');
    // WHERE id = $id ... goes here somehow...
    $q = $this->db->get();

    if ($q->num_rows() == 1) {
        $row = $q->row();
        $data = array(
                'id' => $row->id,
                'title' => $row->title,
                'year' => $row->year,
                'runtime' => $row->runtime,
                'plotoutline' => $row->plotoutline,
                'poster_url' => $row->poster_url
            );
    }

    $q->free_result();
    return $data;

id (PK), title, year, runtime и plotoutline — это столбцы из первой таблицы, а poster_url — это поле из второй таблицы. Вторая таблица также содержит столбец ID (PK), который я не хочу получать, потому что он у меня уже есть.


person Jonathan    schedule 27.04.2009    source источник


Ответы (3)


Джон прав. Вот пример:

$this->db->select('movies.id, 
                   movies.title, 
                   movies.year, 
                   movies.runtime as totaltime,  
                   posters.poster_url');
$this->db->from('movies');
$this->db->join('posters', 'movies.id= posters.id');
$this->db->where('movies.id', $id);
$q = $this->db->get();

Это вернет объекты со свойствами ->id, ->title, ->year, ->totaltime и ->poster_url. Вам не понадобится дополнительный код для извлечения данных из каждой строки.

Не забывайте, что если синтаксис Active Record становится немного громоздким, вы можете использовать полные SQL-запросы и получить те же результаты:

$sql = "SELECT movies.id,
        movies.title,
        movies.year,
        movies.runtime as totaltime,
        posters.poster_url
        FROM movies
        INNER JOIN posters ON movies.id = posters.id
        WHERE movies.id = ?"

return $this->db->query($sql, array($id))->result();

Обе формы гарантируют правильное экранирование ваших данных.

Активная запись CodeIgniter

Привязка запросов в CodeIgniter

person GloryFish    schedule 27.04.2009
comment
Таким образом, я присоединюсь к двум таблицам и получу все результаты правильно? Как я могу указать идентификатор из строки, которую я хочу получить данные?? Что-то вроде "ГДЕ фильмы.id = $id".. - person Jonathan; 28.04.2009
comment
Я добавил дополнительную информацию выше. :) - person GloryFish; 28.04.2009
comment
Есть ли разница в производительности между «Active Record» и обычным кодом SQL??? - person Jonathan; 29.04.2009
comment
На практике существенной разницы не заметил. Active Record CI довольно легковесен. В любом случае я склонен использовать AR для очень простых запросов. По мере того, как они становятся более сложными, я переключаюсь на прямой sql для удобства чтения. Если вы сомневаетесь, проверьте это и убедитесь в этом. В CI есть несколько полезных функций бенчмаркинга, которые упрощают проведение такого рода тестирования: codeigniter.com/user_guide. /libraries/benchmark.html - person GloryFish; 01.05.2009

Звездочка вернет все поля. Чтобы вернуть подмножество из них, то есть все поля, кроме повторяющегося поля идентификатора, просто перечислите нужные столбцы, а не используйте «*».

Часто лучше вообще не использовать звездочку. В будущем приложения кто-то может добавить в таблицу большое поле, которое будет лишним для ваших требований и замедлит ваши запросы.

person Jon Winstanley    schedule 27.04.2009

Проще говоря, с цепочкой методов:

$this->db->select('*')
         ->from('movies')
         ->join('posters', 'movies.id= posters.id')
         ->where('movies.id', $id)
         ->get();
person JonathanEyre    schedule 28.10.2011