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

Posted

技术标签:

【中文标题】如何使用 codeigniter 编辑和删除 group_concat() 上的每个数据【英文标题】:how to edit and delete each on data on group_concat() using codeigniter 【发布时间】: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
    //...

主题表包含这些信息

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

【问题讨论】:

【参考方案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; ?>

【讨论】:

这个答案缺少教育解释。

以上是关于如何使用 codeigniter 编辑和删除 group_concat() 上的每个数据的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter + Datatable 自定义编辑/删除记录

Codeigniter:如何构建使用表单验证和重新填充的编辑表单?

codeigniter 文件上传 - 可选?

Codeigniter:如何使用 jQuery 添加带有多选和删除复选框的列

如何使用 ajax (codeigniter) 在我的编辑表单中获取和显示选定值到 <select2> 标记中

CodeIgniter:使用 HTTPS 和 AWS 时如何从 url 中删除 index.php