Php 什么是处理一组select语句但条件不同的好方法?

Php 什么是处理一组select语句但条件不同的好方法?,php,function,codeigniter,select,Php,Function,Codeigniter,Select,我面临的一个问题是,有许多查询使用类似的select语句,但使用不同的join/where语句 下面是我正在通过CodeIgniter编写的代码示例。我通常做的是生成一个函数get(),它接受一个随机键/值数组。根据传递的键/值,它将生成并运行相应的查询。现在,我想知道这是一种好的做事方式吗?因为正如你所看到的,这个函数变得越来越复杂。起初,我有一大堆函数,比如get_all()、get_only_lessons()等等,但如果要用一两行不同的代码重复同一组代码,那就有点烦人了 我的问题是什么是

我面临的一个问题是,有许多查询使用类似的select语句,但使用不同的join/where语句

下面是我正在通过CodeIgniter编写的代码示例。我通常做的是生成一个函数get(),它接受一个随机键/值数组。根据传递的键/值,它将生成并运行相应的查询。现在,我想知道这是一种好的做事方式吗?因为正如你所看到的,这个函数变得越来越复杂。起初,我有一大堆函数,比如get_all()、get_only_lessons()等等,但如果要用一两行不同的代码重复同一组代码,那就有点烦人了

我的问题是什么是处理这个问题的最好方法

function get($param = NULL)
{
    /*
    SELECT  m.id AS id, CAST(m.order_number AS SIGNED) AS order_number, m.name AS name, m.permalink as permalink, 
        m.suplesson_id as suplesson_id, CAST(sm.order_number AS SIGNED) AS suplesson_order_number
    FROM    lessons m
    JOIN    courses c ON m.course_id = c.id
    LEFT JOIN lessons sm ON m.suplesson_id = sm.id
    WHERE   [various]
    */

    $select =   'm.id AS id, CAST(m.order_number AS SIGNED) AS order_number, m.name AS name, m.permalink as permalink, ';
    $select .= ' m.suplesson_id as suplesson_id';

    if (isset($param['id']) || isset($param['suplesson_order_number']) || isset($param['permalink']))   
        $select .= ', CAST(sm.order_number AS SIGNED) AS suplesson_order_number ';

    $this->db->select($select);
    $this->db->from($this->table_name.' m');
    $this->db->join($this->courses_table_name.' c', 'm.course_id = c.id');

    if (isset($param['id']) || isset($param['suplesson_order_number']) || isset($param['permalink']))
        $this->db->join($this->table_name.' sm', 'm.suplesson_id = sm.id', 'left');

    // where clauses
    if (isset($param['course_id'])) 
        $this->db->where(array('c.id' => $param['course_id']));
    if (isset($param['id'])) 
        $this->db->where(array('m.id' => $param['id']));
    if (isset($param['order_number'])) 
        $this->db->where(array('m.order_number' => $param['order_number']));
    if (isset($param['permalink'])) 
        $this->db->like('m.permalink', $param['permalink'], 'none');
    if (isset($param['suplesson_id'])) 
        $this->db->where(array('m.suplesson_id' => $param['suplesson_id']));
    if (isset($param['suplesson_order_number'])) 
        $this->db->where(array('sm.order_number' => $param['suplesson_order_number']));
    if (isset($param['NULL'])) 
        $this->db->where('m.'.$param['NULL'].' IS NULL');
    if (isset($param['NOT NULL'])) 
        $this->db->where('m.'.$param['NOT NULL'].' IS NOT NULL');

    $this->db->order_by('order_number');

    // filter based on num_rows/offset
    if (isset($param['id']) || isset($param['permalink']))  
        $this->db->limit(1);
    if (isset($param['num_rows']) && isset($param['offset'])) 
        $this->db->limit($param['num_rows'], $param['offset']);

    $query = $this->db->get();

    // return row if expecting 1 result 
    if (isset($param['id']) || isset($param['suplesson_order_number']) || isset($param['permalink']))   
        return ($query->num_rows() == 1) ? $query->row_array() : NULL;

    return ($query->num_rows() > 0) ? $query->result_array() : NULL;
}

运行DB查询的常用方法是将模型代码构造为具有多个函数调用,每个函数调用与一条SQL语句相关,例如:

function get_user($userId)
{
    $this->db->get_where('user', array('userId' => $userId))
    //...
    //...        
}

function delete_user($userId)
{
    $this->db->delete('user',array('userId' => $userId))
}
您可以创建一个名为User_model的模型类,该类包含读取/更新用户表所需的所有函数,因此您可以在控制器中调用特定的模型函数

$user = $this->User_model->get_user($userId)
看起来您正试图构造一个巨大的模型函数,该函数检查各种参数以确定要运行的SQL语句。这不是一个好的设计,不适合Codeignitors MVC模型。
相反,为每个表创建单独的模型,然后在每个模型中为希望运行的每个SQL操作创建单独的函数。从控制器中调用这些模型以获取/更新/删除表中的数据。

您的示例就是我最初所做的。我想最好像您所说的那样,将每个查询保留在自己的函数中。谢谢你消除了我的误解。