如何解决如何使用codeigniter编辑和删除group_concat上的每个数据
我需要编辑或删除GROUP_CONCAT()
上的每个数据。与我有关的主要问题是如何传递每个数据的ID。
我需要将光标添加到“斯瓦希里语”或“物理学”上的那些主题中,我们可以期望该主题上的鼠标光标将随着编辑页面或删除页面上该主题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{
//...
主题表包含这些信息
请您帮助我继续这一部分,谢谢大家
解决方法
您的代码可以是
$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 提琴here
如果您想要更复杂,则必须松开GROUP BY并检测subject_standard_id
另一种可能性,split $ data-> standards_name(由我提供)首先由||组成。然后按,并在单独的变量中都包含两个变量,因此您可以构建更复杂的表结构,这还有一个优点,即每个删除或编辑按钮都有一个ID
您的phpcode看起来像
$str = '3,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,'.',
所以您的查询结果看起来像
$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的冲突越多,重用该方法的可能性就越小;所以构建简单的东西。仅仅因为将合并的内容拆分到不同的“层”中,而被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
请求来传递。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。