如何自动勾选pakkliste_gjenstand中已加入pakkliste_detalj的复选框(非JS)
问题:自动勾选已关联的复选框并显示所有条目
我有两张数据表:
-- TABLE 1: pakkliste_gjenstand COLUMNS: id pakkliste_gjenstand -- TABLE 2: pakkliste_detalj COLUMNS: id prosjekt_id pakkliste_detalj_gjenstand_id pakkliste_detalj_gjenstand
pakkliste_gjenstand表存储可通过复选框选择的条目,选中后会将表1的id存入pakkliste_detalj表的pakkliste_detalj_gjenstand_id字段。现在需要实现反向操作:遍历pakkliste_gjenstand的所有条目,自动勾选那些在pakkliste_detalj表中已存在(匹配表1id和表2pakkliste_detalj_gjenstand_id,且对应指定prosjekt_id)的条目,同时显示所有条目。
我当前用以下PHP代码遍历所有条目:
<?php $do_search=mysqli_query($link, "SELECT * FROM pakkliste_gjenstand ORDER BY pakkliste_gjenstand ASC"); while ($row = mysqli_fetch_array($do_search)) { $id=$row['id']; $produkt=$row['pakkliste_gjenstand']; ?> <input type="checkbox" name="check_list[]" value="<?php echo $id; ?>*<?php echo $produkt; ?>"> <?php echo $produkt; ?> <br> <?php } ?>
尝试过LEFT JOIN、INNER JOIN,还有人建议用RIGHT JOIN,代码如下:
<?php $do_search=mysqli_query($link, "SELECT * FROM pakkliste_gjenstand RIGHT JOIN pakkliste_detalj ON pakkliste_gjenstand.id = pakkliste_detalj.pakkliste_detalj_gjenstand_id WHERE pakkliste_detalj.prosjekt_id = '$prosjektid' ORDER BY pakkliste_gjenstand.pakkliste_gjenstand ASC"); while ($row = mysqli_fetch_array($do_search)) { $id=$row['id']; $produkt=$row['pakkliste_gjenstand']; ?> <input type="checkbox" name="check_list[]" value="<?php echo $id; ?>*<?php echo $produkt; ?>"> <?php echo $produkt; ?> <br> <?php } ?>
但这段代码只显示已添加到pakkliste_detalj的条目,不符合需求,求指导。
解决方案
要实现显示所有条目并自动勾选已关联项,需要用LEFT JOIN查询,同时筛选指定prosjekt_id的记录,然后在输出时判断是否存在关联记录来添加checked属性:
- 修改SQL查询语句:
<?php $do_search = mysqli_query($link, " SELECT pg.id, pg.pakkliste_gjenstand, pd.id AS detalj_id FROM pakkliste_gjenstand pg LEFT JOIN pakkliste_detalj pd ON pg.id = pd.pakkliste_detalj_gjenstand_id AND pd.prosjekt_id = '$prosjektid' ORDER BY pg.pakkliste_gjenstand ASC "); ?>
这里用LEFT JOIN关联两张表,并且把pd.prosjekt_id = '$prosjektid'放在ON条件里,而不是WHERE,这样就能保留pakkliste_gjenstand的所有条目,同时关联上对应prosjekt的detalj记录。
- 修改复选框输出逻辑:
<?php while ($row = mysqli_fetch_array($do_search)) { $id = $row['id']; $produkt = $row['pakkliste_gjenstand']; // 判断是否存在关联的detalj记录,存在则添加checked属性 $checked = !empty($row['detalj_id']) ? 'checked' : ''; ?> <input type="checkbox" name="check_list[]" value="<?php echo $id; ?>*<?php echo $produkt; ?>" <?php echo $checked; ?>> <?php echo $produkt; ?> <br> <?php } ?>
关键说明
- LEFT JOIN确保pakkliste_gjenstand的所有条目都被查询到,即使没有对应的pakkliste_detalj记录
- 将
pd.prosjekt_id的条件放在ON子句中,而不是WHERE,避免过滤掉没有关联记录的条目 - 通过判断关联字段(如
detalj_id)是否为空,来决定是否勾选复选框
内容的提问来源于stack exchange,提问作者abrj
相关产品推荐
相关产品推荐

