如何使用Codeigniter中的两个联接表在表中显示数据

时间:2019-02-11 12:20:37

标签: php sql codeigniter join html-table

如何使用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>

enter image description here

但输出错误,我得到了学生的f名和l名的父母的名字和姓氏。并且父字段显示不正确

1 个答案:

答案 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');