【问题标题】:CodeIgniter query from sql来自 sql 的 CodeIgniter 查询
【发布时间】:2017-02-11 02:51:12
【问题描述】:

如何将此 sql 转换为 codeigniter 查询?我有一个 EER 图的屏幕截图,以帮助您更好地理解。所以要加入三个表。我猜,一个是“pjesma”,然后是“izvodjac”和“izvodi_pjesmu”。这个 sql 在我运行它并给我想要的结果时工作。我也在使用分页,所以我需要限制和偏移以某种方式包括在内。

SELECT pjesma_id, naslov, naziv
FROM pjesma p, izvodjac i, izvodi_pjesmu ip
WHERE p.pjesma_id = ip.pjesma_pjesma_id
AND i.izvodjac_id = ip.izvodjac_izvodjac_id

在模型中:

public function paginacija_pjesme($limit, $offset) {

    $this->db->select('pjesma_id', 'naslov', 'naziv');
    $this->db->from('pjesma p');
    $this->db->join('izvodi_pjesmu ip', 'p.pjesma_id=ip.pjesma_pjesma_id');
    $this->db->join('izvodjac i', 'i.izvodjac_id=ip.izvodjac_izvodjac_id');
    $this->db->limit($limit, $offset);
    $query = $this->db->get();

    return $query->result();
}

编辑: 所以在选择中我使用了错误的语法,这一行:

$this->db->select('pjesma_id', 'naslov', 'naziv');

应该是这样的:

$this->db->select('pjesma_id, naslov, naziv');

【问题讨论】:

    标签: sql codeigniter


    【解决方案1】:

    一些事情,当您在查询构建器类中处理对象时,您可以使用方法链来让事情变得不那么混乱。

    您可能会遇到一个模棱两可的列错误,加入而不是为您的选择添加前缀。如果不发布您所面临的错误,很难判断。

    最好(以防万一)为您的方法参数设置默认值,以防您传递一个空白变量(或出于任何原因不需要)。

    当您在 FROM 语句中使用多个表时,您实际上是在执行 CROSS JOIN,并且您的新代码正在提供 INNER JOIN,尝试将连接语法直接连接到您的 SQL 服务器可能会有所帮助,因为您实际上并没有做同样的事情在您的第一个书面查询和 codeigniter 之间.. 试试下面的 LEFT 连接看看...如果有使用 INNER 的 NULL 连接,它们将被省略

    public function paginacija_pjesme($limit = 10, $offset = 0) {
    
        $query = $this->db->select('p.pjesma_id, p.naslov, i.naziv')
            ->from('pjesma p')
            ->join('izvodi_pjesmu ip', 'p.pjesma_id = ip.pjesma_pjesma_id', 'left')
            ->join('izvodjac i', 'i.izvodjac_id = ip.izvodjac_izvodjac_id', 'left')
            ->limit($limit, $offset)
            ->get();
    
        return $query->result();
    }
    

    您是否遇到任何错误?如果你print_r($query->result()),你会看到什么?

    尝试同时输出$this->db->last_query() - 这将输出 SQL codeigniter 已构建。然后将其直接运行到您的数据库,并从那里查看结果。您甚至可能无需运行即可看到问题。

    这是您当前的 codeigniter 代码生成的示例(如您所见,与您的原始查询不同):

    SELECT pjesma_id, naslov, naziv
    FROM pjesma p
    INNER JOIN izvodi_pjesmu ip ON p.pjesma_id = ip.pjesma_pjesma_id
    INNER JOIN izvodjac i ON i.izvodjac_id = ip.izvodjac_izvodjac_id
    # LIMIT 10,0
    

    【讨论】:

    • 我杀死了我的答案,因为正如你所说,它确实不正确。你的有更多的细节,涵盖了所有其他可能性。
    • 显式一点也没有什么坏处,在这种情况下省略它不是问题:)
    • Array ( [0] => stdClass Object ( [pjesma_id] => 11 ) ) - 这是 print_r 结果,非常感谢
    • SELECT p.pjesma_id FROM pjesma p LEFT JOIN izvodi_pjesmu ip ON p.pjesma_id=pjesma_pjesma_idLEFT JOIN @9876543333@LEFT JOIN。 987654335@ i ON i.izvodjac_id=ip.izvodjac_izvodjac_id LIMIT 5 - 这是 last_query() 的输出
    • 当我运行你在工作台中编写的这个查询(使用 INNER JOIN)时,它可以按我的意愿工作
    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2012-10-28
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多