如何使用 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,
看起来像
| 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、萨彦西 |SELECT GROUP_CONCAT(`subject_id`,',', `subject_name` ORDER BY `subject_id` SEPARATOR " || ") FROM Options GROUP BY `subject_standard_id`
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:如何使用 jQuery 添加带有多选和删除复选框的列