【问题标题】:how to edit and delete each on data on group_concat() using codeigniter如何使用 codeigniter 编辑和删除 group_concat() 上的每个数据
【发布时间】:2021-01-18 11:23:45
【问题描述】:

我需要编辑或删除GROUP_CONCAT() 上的每个数据。我的主要问题是如何传递每个数据的 id。

如果我将光标添加到“kiswahili”或“physics”上的这些主题,我们可以预期鼠标光标在该主题上会随着该主题的 id 链接在编辑页面或删除页面上移动。

这是我的主题模型代码:

public function set_subject_get($idSchool){
    $this->db->select('standards_name, GROUP_CONCAT(subject_name SEPARATOR " || ") as subject, 
    GROUP_CONCAT(subject_id) as subjectid');
    $this->db->from('subjects');
    $this->db->join('standards', 'standards_id = subject_standard_id');
    $this->db->where('subject_school_id', $idSchool);
    $this->db->group_by('subject_standard_id');
    $query = $this->db->get();
    return $query->result();
}

在查看页面我有这样的代码:

if($subjects > 0){
    $n = 1;
    foreach($subjects as $data){
        ?>
        <tr>
            <th scope="row"><?php echo $n;?></th>
            <td><?php echo $data->standards_name; ?></td>
            <td><?php echo $data->subject; ?></td>
        </tr>
        <?php
        $n++;
    }
}else{
    //...

主题表包含这些信息

请你帮我继续这部分谢谢大家

【问题讨论】:

    标签: php mysql codeigniter grouping group-concat


    【解决方案1】:

    你的代码可以是

    $this->db->select('standards_name, GROUP_CONCAT(`subject_id`,',', subject_name ORDER BY `subject_id` SEPARATOR " || ") as subject, 
    

    看起来像

    SELECT 
    GROUP_CONCAT(`subject_id`,',', `subject_name` ORDER BY `subject_id` SEPARATOR " || ")
    FROM
    Options
    GROUP BY `subject_standard_id`
    
    | GROUP_CONCAT(`subject_id`,',', `subject_name` ORDER BY `subject_id` SEPARATOR " || ") | | :------------------------------------------------ ---------------------------------- | | 1,斯瓦希里语 || 2、物理学 || 11,阿斯 | | 3、历史|| 4、英文|| 5、地理|| 6、阿达|| 7、阿达|| 8、阿达|| 9,s || 10 秒 | | 17,斯瓦希里语 || 18、英文|| 19,历史 || 20、公民 | | 12,作为 || 13,asa || 14,asa || 15,maarifa yajamii || 16、萨彦西 |

    db小提琴here

    如果你想要更复杂,你必须松开 GROUP BY 并检测 subject_standard_id 的变化

    另一个可能性你split $data->standards_name(我提供)首先由||然后通过 , 并在单独的变量中都有,所以你可以构建更精细的表结构,这也有一个优点,你有一个 id 为每个删除或编辑按钮

    你的 phpcode 看起来像

    $str = '3,history || 4,english || 5,geography || 6,ada || 7,ada || 8,ada || 9,s || 10,s ';
    $combine = explode("||", $str);
    foreach ($combine as $tex) {
        $id_split = explode(",", trim($tex));
        echo "<a href='www.webpage.de?id=".$id_split[0]."'>".$id_split[1]."</a></br>";
    }
    

    结果

    <a href='www.webpage.de?id=3'>history</a></br>
    <a href='www.webpage.de?id=4'>english</a></br>
    <a href='www.webpage.de?id=5'>geography</a></br>
    <a href='www.webpage.de?id=6'>ada</a></br>
    <a href='www.webpage.de?id=7'>ada</a></br>
    <a href='www.webpage.de?id=8'>ada</a></br>
    <a href='www.webpage.de?id=9'>s</a></br>
    <a href='www.webpage.de?id=10'>s</a></br>
    

    这当然只是top如何做的例子。

    此答案的最终结果将

    【讨论】:

    • 感谢您抽出宝贵时间,能否请您告诉我如何将链接上的 id 添加到视图,因为如果您回显 $data->subjects 演示将 id,主题 || id, subject 那么如何在链接上添加 id。你已经尝试了很多来回答这个问题,请你也可以继续完成这个
    【解决方案2】:

    在给定的模型方法中,您对 sql 的干预越多,您重复使用该方法的可能性就越小;所以构建一些简单的东西。被 sql 的聚合函数的魔力所诱惑,只是为了拆分你在不同“层”中合并的内容,并没有专业/功能优势。保持简单、干净和可重复使用。

    如果您需要对结果进行排序,请在模型的 sql 中进行。

    控制器:

    $grouped = [];
    foreach ($this->SubjectsModel->getSubjectsBySchoolId($schoolId) as $obj) {
        $grouped[$obj->subject_standard_id][$obj->subject_id] = $obj->subject;
    }
    $this->load->view('subjects', ['groupedSubjects' => $grouped]);
    

    型号:

    function getSubjectsBySchoolId(int $schoolId): array
    {
        return $this->db
            ->get_where('subjects', ['subject_school_id' => $schoolId])
            ->result();
    }
    

    查看:

    foreach ($groupedSubjects as $standardId => $subjectsInGroup) {
        foreach ($subjectsInGroup as $id => $name) {
            echo anchor('editController/editMethod/' . $id, 'Edit ' . $name);
        }
    }
    

    您需要修改生成的 html 以适合您的表格结构和链接文本,但这应该展示要使用的重要部分。

    从控制器传递到视图的数据结构尽可能精简。您无需检查数组是否为空。数组将存在,foreach() 只有在有数据要迭代时才会迭代。

    CodeIgniter's manual on its anchor() helper method

    我相信编辑/删除点击会加载一个新页面,并且数据库不会被链接点击直接修改。我这样说是因为数据库写入动作不能由$_GET请求触发,它们应该由$_POST请求传递。

    【讨论】:

      【解决方案3】:

      更改模型中的 sql 以使用 (.) 进行组连接。

      $this->db->select('standards_name, GROUP_CONCAT(`subject_id`,'.', subject_name ORDER BY `subject_id` SEPARATOR " || ") as subject, 
      
      

      所以你的查询结果看起来像

      $subjects = [
          '1.kiswahili || 2.physies || 11.aas',
          '3.history || 4.english || 5.geography || 6.ada || 7.ada || 8.ada || 9.s || 10.s',
          '17.kiswahili || 18.english || 19.history || 20.civics',
          '12.as || 13.asa || 14.asa || 15.maarifa yajamii || 16.sayansi'
      ];
      

      然后创建一个函数:

      function subject_names_to_links($str, $url = null) {
          $domain = is_null($url) ? '/' : $url;
          $str_arr = explode('||', $str);
          $links_arr = array_map(function ($subject) use ($str_arr, $domain) {
              $subject = trim($subject);
              $subject_arr = explode('.', $subject);
              $subject_link = sprintf("<a href=%s?id=\"%s\">%s</a>", $domain, $subject_arr[0], $subject_arr[1]);
              return $subject_link;
          }, $str_arr);
          return implode(' || ', $links_arr);
      }
      

      在您的视图中使用此功能,以生成链接。

      <?php foreach($subjects as $subject): ?>
          <p> <?php echo subject_names_to_links($subject); ?> </p>
      <?php endforeach; ?>
      

      【讨论】:

      • 这个答案缺少教育解释。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      相关资源
      最近更新 更多