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

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

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

Image show the data that have GROUP_CONCAT

我需要将光标添加到“斯瓦希里语”或“物理学”上的那些主题中,我们可以期望该主题上的鼠标光标将随着编辑页面或删除页面上该主题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{
    //...

主题表包含这些信息

subject 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 提琴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>

这当然只是顶部操作的示例。

此答案的最终结果将是 final result

,

更改模型中的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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-