CodeIgniter/PHP/MySQL:使用JOIN检索数据

6

我对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(主键)、标题、年份、运行时间和情节大纲是第一张表中的列,海报URL是第二张表中的字段。第二个表还包含一个ID(主键)列,我不想提取它,因为我已经有了。

4个回答

21

Jon是正确的。这里有一个例子:

$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 中的查询绑定


这样我就可以在两个表之间进行连接并获取所有结果了,对吧?我该如何指定要获取数据的行的ID呢?类似于“WHERE movies.id = $id”这样的语句。 - Jonathan
我在上面添加了更多信息。 :) - GloryFish
'Active Record' 和普通 SQL 代码之间有性能差异吗? - Jonathan
实际上,我没有注意到显著的差异。CI的Active Record非常轻量级。对于非常简单的查询,我倾向于使用AR。当查询变得更复杂时,为了可读性的目的,我会切换到纯SQL。如果不确定,就进行测试来确保。CI有一些有用的基准测试函数,使这种测试变得容易:http://codeigniter.com/user_guide/libraries/benchmark.html - GloryFish

4
一个星号将返回所有字段。如果要返回其中的一个子集,即除了重复的id字段之外的所有字段,请列出您需要的列,而不是使用'*'。
无论如何,不使用星号通常是个好主意。在应用程序的未来,有人可能会向表中添加一个大字段,这将超出您的要求,并减慢您的查询速度。

1

简单来说,使用方法链:

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

0
$this->db->select('*');
$this->db->from('blogs');
$this->db->join('comments', 'comments.id = blogs.id');
$query = $this->db->get();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接