codeigniter 联接两个表并创建索引数组,其中每行是包含多个数据的类别,

qgelzfjb  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(123)

表:政策
| 身份证|标题|描述|open_flg(定义发布状态)|open_date(定义发布日期)|
| - ------|- ------|- ------|- ------|- ------|
| 1个|策略标题1|描述示例|1个|二○二二年二月二十二日|
| 第二章|策略标题2|描述示例|1个|二○二二年二月二十三日|
表:政策案例
| 身份证|策略ID|标题|内容|打开标志|开放日期|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 1个|1个|范例|范例|1个|二○二二年二月二十二日|
| 第二章|第二章|范例|范例|1个|二○二二年二月二十三日|
| 三个|第二章|范例|范例|1个|二○二二年二月二十三日|
我想创建一个表,其中'policy'是父级,policy_case是子级。policy.idpolicy_case.policy_id相同,应该如下所示:
| 身份证|标题|描述|案例标题|案例内容|
| - ------|- ------|- ------|- ------|- ------|
| 1个|策略标题1|描述示例|范例|范例|
| 1个|策略标题1|描述示例|范例|范例|
| 第二章|策略标题2|描述示例|范例|范例|
我使用了以下代码:

$this->db->select('policy.id,policy.title,policy.description,case.policy_id,case.id as case_id,case.title as case_title,case.contents as case_contents');
      $this->db->from('policy');
      $this->db->join('policy_case case', 'case.policy_id = policy.id');
      $join = $this->db->get_compiled_select();
      
      $query = $this->db->query($join);
  $data['policies'] = $query->result_array();

我遇到的唯一问题是policy.descriptionpolicy.title也会根据案例的数量得到重复的内容。如果我尝试使用foreach输出阵列数据,它将创建3个策略标题,而不是2个。
下面是我当前的页面HTML(我还没有找到在policy中循环案例的方法):

<?php foreach ($policies as $key => $val) { ?>
<h2><?php echo $val['title']; ?></h2>
<p><?php echo $val['description']; ?></p>
<h3><?php echo $val['case_title']; ?></h3>
<p><?php echo $val['case_contents']; ?></p>
<?php } ?>
gzszwxb4

gzszwxb41#

您可以重新构造结果,使cases成为每个策略中的一个数组,但这是一个不必要的步骤,不会带来任何好处。
在对结果集进行迭代时,需要跟踪以前的策略,以便决定是否打印<h2>

<?php

$prev_policy_id = null;

foreach ($policies as $policy) {

    if ($policy->policy_id != $prev_policy_id) {
        echo "<h2>{$policy->title}</h2>";
        echo "<p>{$policy->description}</p>";
    }

    echo "<h3>{$policy->case_title}</h3>";
    echo "<p>{$policy->case_contents}</p>";

    $prev_policy_id = $policy->policy_id;
}
?>

这取决于按策略排序的结果集,因此同一策略中的所有案例都在一起:

$data['policies'] = $this->db->select('case.policy_id, policy.title, policy.description, case.id as case_id, case.title as case_title, case.contents as case_contents')
    ->from('policy');
    ->join('policy_case case', 'case.policy_id = policy.id')
    ->order_by('policy.id', 'ASC')
    ->get();

显然,您可以继续使用result_array()(只是在->get()之后添加它),我只是删除了它,因为我发现对象符号更容易阅读。

相关问题