如何使用 codeigniter 编辑和删除 group_concat() 上的每个数据

how to edit and delete each on data on group_concat() using codeigniter

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

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

这是我的主题模型代码:

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{
    //...

主题 table 包含这些信息

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

你的代码可以是

$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,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                         |

db<>fiddle here

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

中的变化

另一种可能性是您 split $data->standards_name(我提供的)首先由 ||然后由 , 和 so 都放在单独的变量中,这样你就可以构建更精细的 table 结构,这也有一个优点,即每个删除或编辑按钮都有一个 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>

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

这个答案的最终结果将

将模型中的 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; ?>

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

如果您需要对结果进行排序,请在模型的 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 以适合您的 table 结构和 link 文本,但这应该展示要使用的重要部分。

从控制器传递到视图的数据结构非常精简。您不需要检查数组是否为空。该数组将存在并且 foreach() 仅当它有数据要迭代时才会迭代。

CodeIgniter's manual on its anchor() helper method

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