在 laravel 中,
通过将 `create()` 替换为 `firstorcreate()` 可安全重运行种子文件,避免重复插入已有权限或角色,同时保留全部历史数据与迁移记录。
当你使用 Spatie 的 laravel-permission 包管理角色与权限时,常需在开发过程中动态扩展权限(例如新增 blog read、blog update)。此时若直接执行 php artisan db:seed --class=RoleAndPermissionSeeder,原代码中的 Permission::create() 和 Role::create() 会因主键/唯一约束抛出异常(如 Integrity constraint violation),或导致重复记录。
✅ 正确做法是改用 firstOrCreate() —— 它会先按条件查询,仅当记录不存在时才创建:
// 替换原 Permission::create() → 使用 firstOrCreate()
foreach ($permissions as $permission) {
Permission::firstOrCreate(['name' => $permission]);
}
// 同样处理角色,确保幂等性
$admin = Role::firstOrCreate(['name' => 'admin']);
$member = Role::firstOrCreate(['name' => 'member']);
Role::firstOrCreate(['name' => 'super-admin']);? 关键优势:
⚠️ 注意事项:
最终,你只需更新 $permissions 数组并重新运行种子命令即可:
php artisan db:seed --class=RoleAndPermissionSeeder
系统将自动注入新权限(如 'blog read'),而原有权限、角色及用户授权关系毫发无损。
# php
# laravel
# ai
# 数据丢失
# class
# delete
# 数据库
# 已有
# 移除
# 当你
# 只需
# 不存在
# 不回
# 时才
# 抛出
# 会先
# 过程中
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
如何在 Go 中正确反序列化多个并列的 XML 元素(而非 XML 数组)
Windows10怎么查看硬件信息_Windows10硬件信息查询方法【指南】
Win11怎么设置鼠标宏_Win11鼠标按键自定义编程教程【详解】
Windows10电脑怎么设置虚拟内存_Win10高级系统设置性能
Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】
如何使用Golang实现容器自动化运维_Golang Docker运维管理方法
Win11怎么设置任务栏对齐方式_Windows11个性化任务栏行为
php订单日志怎么记录物流_php记录订单物流变更日志指南【指南】
Win11怎么关闭定位服务_保护Win11位置隐私设置指南【详解】
如何使用Golang捕获测试日志_Golang testing日志记录方法
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
如何用::实现工具类方法调用_php静态工具类设计技巧【技巧】
ACF 教程:如何正确更新嵌套在多层 Group 字段内的子字段
LINUX怎么设置系统语言_LINUX修改中文环境
Win11怎么设置默认浏览器Chrome_Windows11修改默认网页打开方式
c++如何用AFL++进行模糊测试 c++ Fuzzing入门【安全】
LINUX怎么进行文本内容搜索_Linux grep命令正则表达式用法大全【教程】
为什么Go建议使用error接口作为错误返回_Go Error接口设计原因说明
Win11如何隐藏桌面图标 Win11一键隐藏/显示桌面图标【指南】
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
Windows电脑键盘突然失灵怎么办?(驱动与硬件排查)
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
Python装饰器复用技巧_通用能力解析【教程】
php中::能访问全局变量吗_全局作用域与类作用域区分【操作】
Go 中 defer 语句在 goroutine 内部不返回时不会执行
Go 中 defer 在 goroutine 内部不生效的原因与执行时机详解
MAC如何快速搜索大文件_MAC磁盘空间分析与冗余数据清理【方法】
Win11时间怎么同步到原子钟 Win11高精度时间同步设置【指南】
Win11怎么更改管理员名字 Win11修改账户名称详细步骤【教程】
MAC怎么解压RAR格式文件_MAC第三方解压工具安装与压缩包管理【教程】
Windows10系统怎么查看显卡型号_Win10 dxdiag显示选项卡
C++如何使用std::async进行异步编程?(future用法)
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
如何使用Golang编写单元测试_创建Test函数验证业务逻辑
php怎么捕获异常_trycatch结构处理运行时错误的技巧【方法】
Win11怎么关闭键盘按键音_Win11禁用打字声音反馈【教程】
如何使用 Selenium 正确获取篮球参考网站球员名单元素列表
如何使用Golang实现路由参数绑定_使用Mux和Request解析路径变量
Mac上的iMovie如何剪辑视频?(新手入门教程)
Win11怎么设置虚拟键盘_打开Win11屏幕键盘操作指南【技巧】
Win11怎么设置环境变量_Win11配置Path路径变量【详解】
Win11资源管理器卡顿怎么办 Win11文件资源管理器重启技巧【优化】
php订单日志怎么按状态筛选_php筛选不同状态订单日志教程【教程】
Windows服务无法启动错误1067是什么_进程意外终止的解决方法
Python并发安全问题_资源竞争说明【指导】
Win11怎么连接蓝牙耳机_Win11蓝牙设备配对与连接教程【步骤】
Win11怎么设置组合键快捷方式_Windows11自定义快捷键操作
Win11怎么关闭搜索历史_Win11清除任务栏搜索记录【隐私】
PhpStorm怎么调试PHP代码_PhpStorm断点设置与调试启动步骤【指南】
2025-12-31
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。