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

如何重写Laravel模型属性?替换对象内https://为[[http:]]

解决Laravel模型中替换external_urls里的HTTPS前缀问题

嘿,我来给你支招!在Laravel里处理这种属性值的修改,用**访问器(Accessor)**是最地道的做法,完全符合框架的设计规范。

你已经把external_urls通过$casts转成了object类型,那我们只需要在Training模型里定义一个访问器方法,就能在每次获取这个属性的时候自动完成替换操作。

具体实现代码

直接在你的Training模型里添加下面这个方法:

public function getExternalUrlsAttribute($value)
{
    // 先把object转成数组,方便遍历修改
    $urls = json_decode(json_encode($value), true);
    
    // 遍历每个链接项,替换url里的https://前缀
    foreach ($urls as &$item) {
        if (isset($item['url']) && is_string($item['url'])) {
            $item['url'] = str_replace('https://', '[[http:]]//', $item['url']);
        }
    }
    
    // 再转成object类型保持和原来的类型一致
    return (object)$urls;
}

额外的健壮性优化

如果你的external_urls可能为空或者格式不太规范,可以加个空值判断,避免报错:

public function getExternalUrlsAttribute($value)
{
    // 空值直接返回,避免后续操作出错
    if (empty($value)) {
        return $value;
    }
    
    $urls = json_decode(json_encode($value), true);
    
    foreach ($urls as &$item) {
        if (isset($item['url']) && is_string($item['url'])) {
            $item['url'] = str_replace('https://', '[[http:]]//', $item['url']);
        }
    }
    
    return (object)$urls;
}

效果说明

这样不管你是直接调用$training->external_urls,还是把模型转成JSON返回给前端,拿到的external_urls都会是你想要的结构:

"external_urls": [ { "url": "[[http:]]//google.com/", "name": "test link" } ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:15:24