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

Laravel Livewire中SQL重复列值仅单次打印的实现求助

解决方案

优化查询语句

首先把原查询改成更高效的查询构造器写法,避免先拉取全表再过滤:

$records = Admin::where('name', $name)->where('role', $role)->get();

方案一:Laravel集合处理(适合数据量小的场景)

利用Laravel集合的方法直接在内存中处理数据,按规则提取去重后的值:

组件逻辑

// 在Livewire组件类中
public $name;
public $role;

// 处理reg1:保留所有去重后的值(null和1)
public function getReg1ResultsProperty()
{
    return $this->records->pluck('reg1')->unique()->values();
}

// 处理reg2:保留所有去重后的值(null和1)
public function getReg2ResultsProperty()
{
    return $this->records->pluck('reg2')->unique()->values();
}

// 处理reg3:仅保留去重后的null值
public function getReg3ResultsProperty()
{
    return $this->records->pluck('reg3')
        ->unique()
        ->filter(fn($value) => is_null($value))
        ->values();
}

// 处理reg4:仅保留去重后的1值
public function getReg4ResultsProperty()
{
    return $this->records->pluck('reg4')
        ->unique()
        ->filter(fn($value) => $value === 1)
        ->values();
}

// 获取目标记录(计算属性自动缓存,避免重复查询)
public function getRecordsProperty()
{
    return Admin::where('name', $this->name)->where('role', $this->role)->get();
}

视图渲染

在Livewire的blade视图中直接遍历处理后的结果:

<div class="reg-results">
    <p>reg1: 
        @foreach($reg1Results as $val)
            {{ $val ?? 'null' }}
        @endforeach
    </p>
    <p>reg2: 
        @foreach($reg2Results as $val)
            {{ $val ?? 'null' }}
        @endforeach
    </p>
    <p>reg3: 
        @foreach($reg3Results as $val)
            {{ $val ?? 'null' }}
        @endforeach
    </p>
    <p>reg4: 
        @foreach($reg4Results as $val)
            {{ $val }}
        @endforeach
    </p>
</div>

方案二:数据库聚合查询(适合数据量大的场景)

直接通过SQL聚合函数在数据库层面完成去重和规则过滤,减少内存消耗:

组件逻辑

// 在Livewire组件类中
public function getRegSummaryProperty()
{
    return Admin::where('name', $this->name)->where('role', $this->role)
        ->selectRaw('
            MAX(CASE WHEN reg1 IS NULL THEN "null" END) AS reg1_null,
            MAX(CASE WHEN reg1 = 1 THEN 1 END) AS reg1_1,
            MAX(CASE WHEN reg2 IS NULL THEN "null" END) AS reg2_null,
            MAX(CASE WHEN reg2 = 1 THEN 1 END) AS reg2_1,
            MAX(CASE WHEN reg3 IS NULL THEN "null" END) AS reg3_null,
            MAX(CASE WHEN reg4 = 1 THEN 1 END) AS reg4_1
        ')
        ->first();
}

视图渲染

<div class="reg-summary">
    <p>reg1: 
        @if($regSummary->reg1_null) null @endif
        @if($regSummary->reg1_1) 1 @endif
    </p>
    <p>reg2: 
        @if($regSummary->reg2_1) 1 @endif
        @if($regSummary->reg2_null) null @endif
    </p>
    <p>reg3: {{ $regSummary->reg3_null ?? '' }}</p>
    <p>reg4: {{ $regSummary->reg4_1 ?? '' }}</p>
</div>

针对你提供的测试数据,两种方案最终输出结果一致:

  • reg1: null 1
  • reg2: 1 null
  • reg3: null
  • reg4: 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:20:22