Laravel 5.8中如何显示产品分类名称?
解决Laravel中显示产品关联分类名称的问题
作为Laravel 5.8的初学者,你现在需要通过关联模型来把分类ID转换成名称,具体可以按以下步骤操作:
1. 修正并更新ProductSelectedCategory模型
首先,你需要为每个分类ID字段定义与ProductCategory的关联关系,同时注意修正模型里的拼写错误(你写的$quarded是笔误,应该是$guarded)。
打开app/ProductSelectedCategory.php,添加以下关联方法:
class ProductSelectedCategory extends Model { protected $guarded = ['id']; // 修正拼写错误 protected $fillable = ['subcategory1_id', 'parent_subcategory1_id', 'category_id', 'subcategory2_id', 'parent_subcategory2_id', 'subcategory3_id', 'parent_subcategory3_id', 'subcategory4_id', 'parent_subcategory4_id', 'subcategory5_id', 'parent_subcategory5_id', 'subcategory6_id', 'parent_subcategory6_id', 'subcategory7_id', 'parent_subcategory7_id', 'subcategory8_id', 'parent_subcategory8_id', 'subcategory9_id', 'parent_subcategory9_id', 'product_id' ]; public $timestamps = false; // 主分类关联 public function category() { return $this->belongsTo(ProductCategory::class, 'category_id'); } // 子分类2及其父分类关联 public function subcategory2() { return $this->belongsTo(ProductCategory::class, 'subcategory2_id'); } public function parentSubcategory2() { return $this->belongsTo(ProductCategory::class, 'parent_subcategory2_id'); } // 按照同样的逻辑,为subcategory1/subcategory3到subcategory9,以及对应的parent_subcategoryX_id添加关联方法 // 比如subcategory1、parentSubcategory1,subcategory3、parentSubcategory3...以此类推 }
2. 在Blade模板中显示分类名称
现在你可以通过关联关系直接获取分类名称了,为了避免ID为0(无对应分类)时出现报错,建议用optional()辅助函数处理空值:
@foreach($products as $product) {{ $product->name }} - {{ optional($product->selected_categories->first()->parentSubcategory2)->name ?? '未设置分类' }}, @endforeach
optional()会处理关联模型不存在的情况(比如parent_subcategory2_id为0时)?? '未设置分类'是当分类名称为空时显示的默认文本,你可以根据需求修改。
3. 优化性能:预加载关联
如果直接在循环中调用关联,会触发N+1查询问题(每个产品单独查一次分类),建议在控制器查询产品时预加载需要的关联:
// 只预加载你需要的parentSubcategory2关联 $products = Product::with('selected_categories.parentSubcategory2')->get(); // 如果需要同时加载多个分类关联 $products = Product::with([ 'selected_categories.category', 'selected_categories.subcategory1', 'selected_categories.parentSubcategory2' ])->get();
另外顺便提个小问题:你的Product模型里的category()方法外键写错了,目前是return $this->belongsTo('App\ProductCategory', 'id_producer');,这里的外键应该关联到分类字段,而不是id_producer,如果是笔误建议及时修正哦。
内容的提问来源于stack exchange,提问作者goslscs
相关产品推荐
相关产品推荐

