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

Laravel Blade无法直接使用模型追加属性is_down的问题

问题原因

核心问题出在你的属性访问器写法有副作用:

  • 你在访问器里没有直接返回计算结果,反而把计算出来的is_down值写入了模型内部用来存数据库原始字段的$attributes数组。
  • is_down本身是自定义的追加虚拟属性,数据库里不存在这个字段,手动把它塞进$attributes数组后,会干扰Laravel模型的属性读取逻辑:直接在Blade的@if中调用时,模型会误把它当成数据库原生字段处理,导致返回的布尔判断值异常,active类自然渲染不出来。
  • 当你先把$post->is_down赋值给临时变量$a时,访问器的计算结果被存到了独立的普通变量里,不再受模型内部属性读取逻辑的干扰,所以判断能正常生效。
修复方案

按下面的步骤调整即可直接在模板中使用该属性判断:

  • 重写访问器,去掉对$attributes数组的赋值操作,直接返回计算结果即可。因为is_down不是数据库真实字段,不需要接收$value参数:
public function getIsDownAttribute()
{
    $downUserIds = (array)json_decode($this->attributes['down']);
    return in_array(Auth::user()->id ?? 0, $downUserIds);
}
  • 在Post模型中,将is_down加入到$appends配置数组,让模型能正确识别这个追加属性,避免属性读取、序列化时出现异常:
protected $appends = ['is_down'];
  • (可选优化)如果down字段在数据库中存储的是JSON格式的用户ID数组,可以直接在模型中配置类型转换,省去手动json_decode的步骤:
protected $casts = [
    'down' => 'array',
];

配置后访问器可以进一步简化:

public function getIsDownAttribute()
{
    return in_array(Auth::user()->id ?? 0, $this->down ?? []);
}

调整完成后,直接在Blade中写@if($post->is_down)就能正常判断,不需要再定义临时变量中转。

内容的提问来源于stack exchange,提问作者Ömer Faruk Demirel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:09:33