model类中如何避免一个字段不被save?

比如 UserModel 有一个字段x是数据库中不存在的,想达到目的如下:

  1. 方便的给user实例的x字段赋值和取值
  2. user->save() 的时候避开x字段,避免造成数据库插入或者更新报错。

fillable和guarded属性好像只能用来控制批量赋值时的行为,使用save方法的时候无法起到作用。

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

可参考访问器 & 修改器 修改器《Laravel 7 中文文档》

如果是个数据库不存在的临时字段,修改器需要稍微改造下

/**
 * 访问器:获取用户的姓名.
 *
 * @return string
 */
public function getFullNameAttribute()
{
    // 这里直接使用属性 $this->xxx,可以是数据字段,也可以是临时字段(属性)
    return "{$this->first_name} {$this->last_name}";
}

/**
 * 修改器:设置用户的姓名.
 *
 * @param string $value
 * @return void
 */
public function setFirstNameAttribute(string $value)
{
    // 临时字段(属性)直接设置值
    $this->first_name = strtolower($value);

    // 原本是修改现有字段
    // $this->attributes['first_name'] = strtolower($value);
}
3年前 评论
yanwushu (楼主) 3年前
lddtime (作者) 3年前
yanwushu (楼主) 3年前
讨论数量: 9
da_house

可以加个注解呢?

/**
 * @property  $test
 */ 

希望可以帮助到你

3年前 评论
yanwushu (楼主) 3年前

比如: 重写 save

封装个saveHello 方式之类的

3年前 评论
yanwushu (楼主) 3年前
Epona

讲道理的话。。save传值应该只传需要的值,多余的应该unset掉

3年前 评论
yanwushu (楼主) 3年前

可参考访问器 & 修改器 修改器《Laravel 7 中文文档》

如果是个数据库不存在的临时字段,修改器需要稍微改造下

/**
 * 访问器:获取用户的姓名.
 *
 * @return string
 */
public function getFullNameAttribute()
{
    // 这里直接使用属性 $this->xxx,可以是数据字段,也可以是临时字段(属性)
    return "{$this->first_name} {$this->last_name}";
}

/**
 * 修改器:设置用户的姓名.
 *
 * @param string $value
 * @return void
 */
public function setFirstNameAttribute(string $value)
{
    // 临时字段(属性)直接设置值
    $this->first_name = strtolower($value);

    // 原本是修改现有字段
    // $this->attributes['first_name'] = strtolower($value);
}
3年前 评论
yanwushu (楼主) 3年前
lddtime (作者) 3年前
yanwushu (楼主) 3年前

用 model 内置的 saving 事件

3年前 评论
yanwushu (楼主) 3年前

用 $appends 追加一个字段:序列化《Laravel 8 中文文档》

3年前 评论
yanwushu (楼主) 3年前

先过滤,再保存

$user->fill($data);
$user->save();
3年前 评论
yanwushu (楼主) 3年前

这样试试:序列化《Laravel 8 中文文档》

use Illuminate\Database\Eloquent\Model;

class Demo extends Model
{
    /**
     * 追加字段
     *
     * @param $value
     */
    protected $appends = [
        '你要的字段X'
    ];

    /**
     * x 的访问器
     *
     * @param $value
     */
    public function get你要的字段XAttribute($value)
    {
        return ....$value;
    }
}
3年前 评论
yanwushu (楼主) 3年前
yanwushu (楼主) 3年前

用 Model Observer 监听 saving 方法,把不需要的 attributes unset 掉

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!