PHP中如何从stdClass对象获取指定字符串,实现分类及关联产品正确展示
问题核心原因
你遇到的展示异常完全是三个逻辑错位导致的:
- 模板外层循环的变量对应关系搞反:
$data['prod']是分类对象组成的索引数组,你写的foreach($data['prod'] as $cats => $pros)里,$cats拿到的是数组的数字键(也就是你页面上看到的0、1这类索引值),真正的分类对象反而被传给了后面的$pros变量,所以标题位置才会显示数字 - 后端构造数据时覆盖了原有字段:循环里把分类对象本来存储分类ID的
id属性,直接赋值成了关联产品列表,打乱了原有分类对象的结构 - 内层循环直接输出对象:遍历产品时拿到的是每个产品的stdClass对象,没有读取对象上的具体字段,直接输出对象本身会触发类型转换错误
后端数据逻辑修正
原来的逻辑会覆盖分类的原有id字段,应该新增独立属性存关联产品,不要改动原有分类的原生字段:
$get_cat = $this->AdminModel->getcategorie(); foreach ($get_cat as $cat) { // 单独新增products属性存关联产品列表,不覆盖原有的id、分类名等字段 $cat->products = $this->AdminModel->getproducts($cat->id); } $data = ['prod' => $get_cat];
改完后每个分类对象会保留原来的所有表字段(比如分类ID、分类名称等),同时附带一个products属性存该分类下的所有关联产品。
前端模板逻辑修正
把循环的变量对应关系理清楚,直接从对象上读取对应字段值,不要用错位的键值解构:
<?php foreach($data['prod'] as $cat): // 直接获取每个分类对象,不再做错误的键值拆分 ?> <div class="container-fluid"> <div class="card card-default collapsed-card"> <div class="card-header"> <!-- 替换成你分类表中存储分类名称的实际字段名,比如分类表字段叫cat_name就写$cat->cat_name --> <h3 class="card-title"><?php echo $cat->cat_name; ?></h3> </div> <div class="card-body"> <table class="table table-bordered table-striped"> <thead> <tr> <th>#</th> <th>Product Name</th> <th>Edit</th> <th>Delete</th> </tr> </thead> <tbody> <?php $i=1; foreach($cat->products as $pro): // 从分类对象的products属性里遍历关联产品 ?> <tr> <td><?php echo $i++; ?></td> <!-- 替换成你产品表中存储产品名称的实际字段名,比如产品表字段叫product_name就写$pro->product_name --> <td><?php echo $pro->product_name; ?></td> <td>Edit</td> <td>Delete</td> </tr> <?php endforeach; ?> </tbody> </table> </div> </div> </div> <?php endforeach; ?>
调试技巧
如果不确定自己的查询返回的对象具体有哪些字段,直接在循环里临时跑一行var_dump($cat); exit;,看打印出来的stdClass的属性名,对应填到模板里就行,不用硬猜字段名。
注意:所有数据库查询返回的stdClass对象,必须通过
->属性名的方式读取具体值,不能直接echo对象本身,否则会触发对象到字符串的类型错误。
内容的提问来源于stack exchange,提问作者abdallah al sawaqi
相关产品推荐
相关产品推荐

