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
相关产品推荐
相关产品推荐

