如何使用Codeigniter中的两个联接表在表中显示数据
我想在表格视图中同时显示学生表格和父表格数据。我已经将父ID用作两个表的外键。
我使用了此代码,但无法正常工作。
这是我的模特
function fetch_data()
{
$sql = "SELECT * FROM student As st LEFT JOIN parent As pt ON st.p_id =pt.p_id";
$query = $this->db->query($sql);
if($query->num_rows() > 0)
{
return $query->result();
}else{
return false;
}
}
这是我的控制人
function index()
{
$this->load->model('Tableview_model');
$student_data= $this->Tableview_model->fetch_data();
$data["student_data"] = $student_data;
$parent_data=$this->Tableview_model->fetch_data();
$data["parent_data"] = $parent_data;
$this->load->view('register_students', $data);
}
这是视图
<tbody>
<?php
if( !empty($student_data && $parent_data ) )
{
foreach ($student_data AS $student) {
?>
<tr>
<td><?php echo $student->student_code; ?></td>
<td><?php echo $student->f_name; ?> <?php echo $student->l_name; ?></td>
<td><?php echo $student->tel; ?></td>
<?php
}
?>
<td></td>
<?php
foreach ($parent_data AS $parent) {
?>
<td><?php echo $parent->f_name; ?> <?php echo $parent->l_name; ?></td>
<?php
}
?>
</tr>
<?php
}
?>
</tbody>
但输出错误,我得到了学生的f名和l名的父母的名字和姓氏。并且父字段显示不正确
答案 0 :(得分:1)
不知道为什么将数据分割为2个不同的数组和循环,两个表都已经使用JOIN
,可以实现以下目标:
<?php
foreach ($student_data AS $student) {
?>
<tr>
<td><?php echo $student->student_code; ?></td>
<td><?php echo $student->f_name; ?> <?php echo $student->l_name; ?></td>
<td><?php echo $student->tel; ?></td>
<td><?php echo $student->tel; ?></td>
<?php
if(isset($student->f_name) && isset($student->l_name)){ // using isset() because of LEFT JOIN
?>
<td><?php echo $student->f_name; ?> <?php echo $student->l_name; ?></td>
<?php
}
?>
您已经在这里从查询中获取所有信息:
$data["student_data"] = $student_data;
因此,当您在查询中使用JOIN
时,无需运行两次查询。这是不必要的:
$parent_data=$this->Tableview_model->fetch_data();
$data["parent_data"] = $parent_data;
代码中的问题/解释:
使用foreach()
开始<tr>
,它将重复进行,直到foreach
结束。但是使用foreach()
进行第二次<td>
时,它将重复直到foreach
结束,这将增加<td>
而不是<tr>
。
简单地说,您是在重复列而不是行,如果您一次使用循环,此问题将得到解决。
侧面说明:,您需要使用CI join method来代替原始查询。像这样:
// using last param as 'left' for LEFT JOIN.
$this->db->join('parent pt', 'st.p_id = pt.p_id', 'left');