我可以对多个表使用单个 CodeIgniter 模型吗?

问题描述 投票:0回答:3

我有一个包含多个桌子的体育赛事数据库。一些表保存结果的记录,有一个用户配置文件表,以及一些杂项表。

我的模型如下:

class Results extends CI_Model
{
    public function __construct()
    {
        parent::__construct();
    }

    public function displayrecords($table) {
        $query=$this->db->query("select * from " . $table);
        return $query->result();
    }

    public function getdisplayname($table) {
        $query=$this->db->query("select * from " . $table);
        return $query->result();
    }

    public function updatetable() {

    }

    public function deleterecords($table, $id) {
        $this->db->query("delete * from " . $table . " where id='" . $id . "'");
    }
}

索引视图的控制器:

public function index() {
    // Load the models
    $this->load->model('Results');
    $this->load->model('Info');
    $this->load->model('TableNames');

    // Create the array to store the data for the index page
    $data['results'] = array();

    // Get a list of all the tables in the event database
    $tables = $this->db->list_tables();
    $data['tables'] = array();

    // Loop through the list of table names and extract the results tables
    foreach($tables as $table) {
        if (strpos($table, "rs_") === 0) {
            array_push($data['tables'], $table);
            $temp = $this->Results->displayrecords($table);
            array_push($data['results'], $temp);
            $data['headnames'] = $this->db->list_fields($table);
        }
    }

    // Get the event info data and the list of Human Readable Table Names
    $data['tablenames'] = $this->TableNames->getnames();
    $data['eventinfo'] = $this->Info->getinfo();

    // Render the templates
    $this->parser->parse('templates/index_header', $data);
    $this->parser->parse('pages/index', $data);
    $this->parser->parse('templates/footer', $data);
}

我想弄清楚的是,是否建议使用单个 CodeIgniter 模型以及所有结果表。结果表示例:21KM 赛事的 30 至 39 岁男性前十名以及 21KM 赛事的 40 至 49 岁前十名男性。我目前拥有使用相同模型方法的所有结果表,例如:

public function displayrecords($table) {
    $query=$this->db->query("select * from " . $table);
    return $query->result();
}

以结果表为参数,显示结果。我会为每个结果表创建模型,但我事先不知道表的名称、列等。每个结果表都是由管理员通过网页创建的,并根据需要添加到数据库中。每个表都会对其执行相同的操作,删除行,更新行。这就是为什么我认为最好有一个可以与所有表格一起使用的模型。

我不确定我的处理方式是否正确,因为我似乎已经遇到了一些问题。例如,当尝试从表中删除记录时,我可以获得需要删除的行的 id,但我不确定如何获取数据库表名称,因为 deleterecords 方法需要 2 个参数 $id和 $tablename 来正确删除记录。模型方法如下:

public function deleterecords($tablename, $id) {
    $this->db->query("delete from " . $tablename . " where id='" . $id . "'");
}

然后在视图中我显示每个结果表:

foreach ($table as $row) {
    echo "<tr id='result_" . $row->id . "'>";
    echo "<td>" . $row->Place . "</td>";
    echo "<td class='bibcell'>" . $row->BibNumber . "<a class='editbut' href=''><img class='bibnum' src='" . base_url() . "assets/images/editicon.png' width='80' style='padding-left: 20px;'></a><a class='delbut' href='deletedata?id=" . $row->id . "'><img src='" . base_url() . "assets/images/deleteicon.png' width='75' style='padding-left: 5px;'></a></td>";
    echo "<td>" . $row->Name . "</td>";
    echo "<td>" . $row->Age . "</td>";
    echo "<td>" . $row->Club . "</td>";
    echo "<td>" . $row->Time . "</td>";
    echo "<td><select class='user-options'><option value='pending' style='background: red;'>Pending</option><option value='checked' style='background: green;'>Checked</option></select></td>";
    echo "</tr>";
}

使用隐藏输入是获取表名称的方法吗?CodeIgniter 中可能有功能可以处理使用单个模型的多个表吗?

编辑:

我已经设法弄清楚这一点:

echo "<td class='bibcell'>" . $row->BibNumber . "<a class='editbut' href=''><img class='bibnum' src='" . base_url() . "assets/images/editicon.png' width='80' style='padding-left: 20px;'></a><a class='delbut' href='deletedata?id=" . $row->id . "&tablename=" . $tables[$i] . "'><img src='" . base_url() . "assets/images/deleteicon.png' width='75' style='padding-left: 5px;'></a></td>";

将 id 和表名传递给要删除的模型方法,但我得到了未定义的变量表名。我可以看到表名变量在 url 中。

http://localhost/results/pages/deletedata?id=1&tablename=rs_toptenfemale
php codeigniter
3个回答
0
投票

我不确定你的情况,但你可以在模型中使用多个函数,并且可以在单个模型中处理所有表(但我认为这不是可取的,也是好的做法)

您可以使用这样的动态函数来避免模型中函数太多

<?php 

if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Common_model extends CI_Model {

  
public function insertContent($data,$table){
    $this->db->insert($table,$data);    
    if($this->db->affected_rows() > 0)
    {
        return TRUE; 
    }
    else{
        return FALSE;
    }
}

public function updateContent($data,$table,$whereField,$value){

    $this->db->where($whereField,$value);
    $update=$this->db->update($table, $data);
    if ($update > 0) {
        return TRUE;
    } else {
        return FALSE;
    }
}

public function login_check($data,$table)
{
    $this->db->select('*');
    $this->db->where($data);
    $query=$this->db->get($table);
    if($query->num_rows()>0)
    {
        return TRUE;         
    } else {
        return FALSE;
    }
}

public function retriveTableDetails($table)
{

    $this->db->select('*');
    $this->db->from($table);
    $query=$this->db->get();
    if($query->num_rows()>0)
    {
        return $query->result();
    } else {
        return FALSE;
    }
}

public function retriveTableDetailsById($table,$id)
{

    $this->db->select('*');
    $this->db->from($table);
    $this->db->where('id',$id);
    $query=$this->db->get();
    if($query->num_rows()>0)
    {
        return $query->result();
    } else {
        return FALSE;
    }
}


0
投票
Please use below code for handle operations in common model.
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Users_model extends CI_Model 
{
  function __construct()
  {
    parent::__construct();
    $this->load->database();
  }

  //get data with whare condition OR without where condition EX: get_where() OR get()
  function select_where($table,$where='',$limit='',$offset='')
  {
    if ($where!=="")
    {
      return $this->db->get_where($table,$where,$limit,$offset)->result();
    }
    else
    {
      return $this->db->get($table,$limit,$offset)->result(); 
    }
  }    

  //count data with whare condition OR without where condition  
  function select_count($table,$where='')
  {
    if ($where!=="")
    {
      $this->db->select('*')->from($table)->where($where); 
      $q = $this->db->get(); 
      return $q->num_rows();
    }
    else
    {
      $this->db->select('*')->from($table); 
      $q = $this->db->get(); 
      return $q->num_rows();
    }
  }

  //Insert Data
  public function insert_data($table,$data)
  {
    return $this->db->insert($table,$data);
  }
  
  //update data with whare condition OR without where condition
  public function update_data($table,$datak,$edit)
  {
    $field=$this->db->field_data($table);
    $tid=$field[0]->name;
    $data=array(
      $tid=>$edit); 
    $this->db->where($data); 
    $res=$this->db->update($table,$datak);
    if($res)
    {
      return true;
    }
    else
    {
      return false;
    }
  }  
  public function delete_where($table,$data)
  {
    if($this->db->delete($table,$data))
    {
      return true;
    }
    else
    {
      return false;
    }
  } 



}


0
投票

是的,您可以对多个表使用单个 CodeIgniter 模型,但必须仔细管理它以保持清晰度和关注点分离。

方法 1:具有动态表处理的单一模型 您可以编写单个模型并为每个操作动态设置表名称。例如:

class Universal_model extends CI_Model {
private $table;

public function setTable($tableName) {
    $this->table = $tableName;
}

public function getAll() {
    return $this->db->get($this->table)->result_array();
}

public function getById($id) {
    return $this->db->get_where($this->table, ['id' => $id])->row_array();
}

public function insert($data) {
    return $this->db->insert($this->table, $data);
}

public function update($id, $data) {
    return $this->db->where('id', $id)->update($this->table, $data);
}

public function delete($id) {
    return $this->db->where('id', $id)->delete($this->table);
}

}

使用示例:

$this->load->model('Universal_model', 'model');
$this->model->setTable('users');
$users = $this->model->getAll();

$this->model->setTable('products');
$products = $this->model->getAll();

方法 2:使用继承 您可以为常见操作创建基本模型,并根据特定表需求对其进行扩展。 基本型号:

class MY_Model extends CI_Model {
    protected $table;

    public function getAll() {
        return $this->db->get($this->table)->result_array();
    }

    public function getById($id) {
        return $this->db->get_where($this->table, ['id' => $id])->row_array();
    }

    public function insert($data) {
        return $this->db->insert($this->table, $data);
    }

    public function update($id, $data) {
        return $this->db->where('id', $id)->update($this->table, $data);
    }

    public function delete($id) {
        return $this->db->where('id', $id)->delete($this->table);
    }
}

具体型号:

class Users_model extends MY_Model {
    protected $table = 'users';
}

class Products_model extends MY_Model {
    protected $table = 'products';
}

使用示例:

$this->load->model('Users_model');
$users = $this->Users_model->getAll();

$this->load->model('Products_model');
$products = $this->Products_model->getAll();

最佳实践

  • 仅当表具有相似的结构和操作时才使用单一模型。
  • 如果要动态设置表名称,请清楚地记录逻辑。
  • 考虑使用单独的模型来进行复杂或特定于表的操作。
© www.soinside.com 2019 - 2024. All rights reserved.