如何使用 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
请求传递。
我需要编辑或删除 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
请求传递。