You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Blade报错:htmlspecialchars参数需为string但传入array

报错原因

两个核心问题导致报错:

  1. 控制器查询逻辑错误:当前代码循环查询每个顶级分类的子分类存入$categories数组,既丢失了顶级分类本身的数据,还产生了N+1查询问题;另外查询parent_id为null的条件应该用whereNull方法,直接传null作为where值在部分数据库驱动下会生成无效SQL。
  2. Blade模板语法错误:{{ $var }}语法底层会自动调用htmlspecialchars()对字符串做转义输出,该方法仅接受字符串类型参数,直接传入集合/模型对象(本质是数组结构)时会因为类型不匹配直接触发报错。
修复方案

第一步:在Category模型定义关联

先在分类模型中声明子分类、文章的关联关系,支持后续预加载:

// app/Models/Category.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    // 关联子分类
    public function children()
    {
        return $this->hasMany(Category::class, 'parent_id');
    }

    // 关联分类下的文章,根据实际外键调整参数
    public function articles()
    {
        return $this->hasMany(Article::class, 'category_id');
    }
}

第二步:重构控制器查询逻辑

用Eloquent的嵌套预加载一次性取出所有需要的数据,避免循环查询,同时保留顶级分类数据:

// 控制器方法
public function index()
{
    // 查询所有顶级分类,同时预加载子分类、子分类绑定的文章
    $categories = Category::whereNull('parent_id')
        ->with('children.articles')
        ->get();

    return view('marketplace.categories.index', compact('categories'));
}

第三步:修正Blade模板遍历逻辑

分层遍历数据,只在{{}}中输出字符串类型的具体字段,不要直接输出整个对象/集合:

<div class="category-list">
    @foreach ($categories as $parent)
        <div class="parent-category">
            {{-- 输出顶级分类名称,替换为表中实际的分类名字段 --}}
            <h2>{{ $parent->name }}</h2>

            {{-- 遍历当前顶级分类下的子分类 --}}
            @if ($parent->children->isNotEmpty())
                <div class="child-category-list">
                    @foreach ($parent->children as $child)
                        <div class="child-category">
                            <h3>{{ $child->name }}</h3>

                            {{-- 遍历子分类下绑定的文章 --}}
                            @if ($child->articles->isNotEmpty())
                                <ul class="article-list">
                                    @foreach ($child->articles as $article)
                                        <li>
                                            {{-- 替换为实际的文章路由、标题字段 --}}
                                            <a href="{{ route('articles.show', $article->id) }}">{{ $article->title }}</a>
                                        </li>
                                    @endforeach
                                </ul>
                            @endif
                        </div>
                    @endforeach
                </div>
            @endif
        </div>
    @endforeach
</div>
补充说明

如果需要调试数据结构,不要直接用{{ $category }}输出,用{{ dump($category) }}或者@php dd($category) @endphp打印,这类调试方法可以接受数组、对象类型参数,不会触发转义报错。
如果是超过两级的无限级分类,可以把分类遍历的逻辑抽成递归Blade片段复用,避免重复写遍历代码。

内容的提问来源于stack exchange,提问作者ottz0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:12:22