CodeIgniter 3:使用外键从表中获取数据
在关系型数据库设计中,外键是关联多张表的核心机制,借助外键可以快速查询出关联表的相关数据。在CodeIgniter 3框架中,我们可以通过模型层编写联表查询逻辑,结合外键关系高效获取所需数据。本文将通过一个实际案例,演示如何基于外键实现多表数据查询。
场景说明
假设我们有两个业务表,分别是用户表users和订单表orders,两个表的结构如下:
| users表字段 | 说明 |
|---|---|
| id | 用户ID,主键 |
| username | 用户名称 |
| 用户邮箱 |
| orders表字段 | 说明 |
|---|---|
| id | 订单ID,主键 |
| user_id | 用户ID,外键,关联users表的id字段 |
| order_sn | 订单编号 |
| total_amount | 订单总金额 |
我们的需求是:查询所有订单信息,同时关联查出每个订单对应的用户名称和用户邮箱。
模型层实现联表查询
在CodeIgniter 3中,我们通常在模型里编写数据库查询逻辑。首先创建订单模型Order_model.php,放置在application/models/目录下,通过Active Record类的join方法实现基于外键的联表查询:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Order_model extends CI_Model {
// 订单表名称
protected $table = 'orders';
public function __construct() {
parent::__construct();
// 加载数据库类
$this->load->database();
}
/**
* 获取所有订单及关联的用户信息
* @return array 包含订单和用户信息的数组
*/
public function get_orders_with_user() {
// 选择需要的字段,避免字段名冲突可以给表起别名
$this->db->select('o.id as order_id, o.order_sn, o.total_amount, u.username, u.email');
// 指定主表
$this->db->from($this->table . ' as o');
// 基于外键user_id关联users表,左连接确保所有订单都能被查出来
$this->db->join('users as u', 'o.user_id = u.id', 'left');
// 执行查询
$query = $this->db->get();
// 返回结果数组
return $query->result_array();
}
}上面的代码中,我们通过$this->db->join()方法指定了关联规则:订单表的user_id字段等于用户表的id字段,使用左连接保证即使某个订单的用户信息不存在,订单本身也会被查询出来。同时通过给表起别名o和u,避免了两个表存在同名字段时的冲突问题。
控制器中调用模型获取数据
接下来创建控制器Order.php,放置在application/controllers/目录下,在控制器中加载模型并调用查询方法,将数据传递给视图:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Order extends CI_Controller {
public function __construct() {
parent::__construct();
// 加载订单模型
$this->load->model('Order_model');
}
/**
* 订单列表页
*/
public function index() {
// 调用模型方法获取带用户信息的订单数据
$data['order_list'] = $this->Order_model->get_orders_with_user();
// 加载订单列表视图
$this->load->view('order/index', $data);
}
}视图层渲染数据
最后创建视图文件index.php,放置在application/views/order/目录下,将数据以表格形式展示:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>订单列表</title>
</head>
<body>
<h3>订单列表</h3>
<table border="1" cellpadding="5" cellspacing="0">
<tr>
<th>订单ID</th>
<th>订单编号</th>
<th>订单金额</th>
<th>用户名称</th>
<th>用户邮箱</th>
</tr>
<?php if (!empty($order_list)): ?>
<?php foreach ($order_list as $order): ?>
<tr>
<td><?php echo $order['order_id']; ?></td>
<td><?php echo $order['order_sn']; ?></td>
<td><?php echo $order['total_amount']; ?></td>
<td><?php echo $order['username']; ?></td>
<td><?php echo $order['email']; ?></td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr>
<td colspan="5" align="center">暂无订单数据</td>
</tr>
<?php endif; ?>
</table>
</body>
</html>注意事项
在实际使用中还需要注意几个问题:
- 如果数据库中的外键设置了约束,需要确保关联表的主键数据存在,避免出现查询异常。
- 如果查询的表数量较多或者数据量较大,可以适当添加查询条件,比如通过
$this->db->where()方法筛选特定用户的订单,减少不必要的数据查询。 - 如果需要调整关联方式,可以修改
join方法的第三个参数,可选值包括left(左连接)、right(右连接)、inner(内连接)等,根据实际业务需求选择。
通过以上步骤,我们就可以在CodeIgniter 3中基于外键关系,轻松实现多表数据的关联查询和展示。