在 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 】
相关推荐:
Linux如何安装JDK11_Linux环境变量配置与Java开发环境搭建【教程】
Go语言中slice追加操作的底层共享机制解析
如何在 Go 中调用动态链接库(.so)中的函数
Win11怎么关闭边缘滑动手势_Windows11禁用触摸屏边缘操作
Win11 C盘满了怎么清理 Win11磁盘清理和存储感知使用教程【新手必看】
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
如何自定义Windows终端的默认配置文件?(PowerShell/CMD)
win11 OneDrive怎么彻底关闭 Win11禁用并卸载OneDrive教程【分享】
php8.4如何调用com组件_php8.4windows下com操作指南【教程】
Mac的访达(Finder)怎么用_Mac文件管理入门教程【详解】
php文件怎么变mp4保存_php输出视频流保存为mp4操作【操作】
Win11怎么更改电脑名称_Windows 11修改计算机名操作指南【步骤】
Windows如何拦截腾讯视频广告_Windows拦截腾讯视频广告方法【方法】
php怎么下载安装并配置环境变量_命令行调用PHP技巧【技巧】
Python lxml的etree和ElementTree有什么区别
Win11怎么开启智能存储_Windows11存储感知自动清理文件
Windows10电脑怎么设置电源按钮_Win10按电源键关机或休眠
c++中如何对数组进行排序_c++数组排序算法汇总
Win11怎么设置默认浏览器Chrome_Windows11修改默认网页打开方式
Win11怎么打开注册表_Windows 11注册表编辑器启动命令【步骤】
如何在Golang中指定模块版本_使用go.mod控制版本号
Mac自带的词典App怎么用_Mac添加和使用多语言词典【技巧】
php查询数据怎么导出csv_查询结果转csv文件保存【操作】
Windows怎样关闭桌面弹窗广告_Windows关闭桌面弹窗设置【教程】
如何快速验证Golang安装是否成功_运行go version和hello world示例
Win10 BitLocker加密教程 Win10给磁盘驱动器上锁【安全】
Win11怎么更改鼠标指针方案_Windows11自定义鼠标光标样式与大小
如何使用Golang实现函数指针_函数变量与回调示例
Mac如何开启夜览模式_Mac护眼模式设置与定时
Win11怎么设置闹钟_Windows 11时钟应用闹钟设置指南【详解】
windows系统如何安装cab更新补丁_windows手动安装更新包教程
Windows Defender扫描失败怎么办_安全模块损坏修复方式
Python 中将 ISO 8601 时间戳转换为日期并计算日期差值的完整教程
Python函数接口文档化_自动化说明【指导】
Win10怎么限制单程序CPU占用上限_Win10任务管理器亲和性或第三方工具均衡负载【技巧】
Win11如何更改任务栏颜色 Win11自定义任务栏背景色【美化】
Win11任务栏怎么放到顶部_Win11修改任务栏位置方法【详细】
VSC怎么配置PHP的Xdebug_远程调试设置步骤【详解】
Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡时长设置【步骤】
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
Win11怎么设置右键刷新选项_Windows11显示更多选项技巧
Win11如何设置计划任务 Win11定时执行程序教程【详解】
php中::能用于接口静态方法吗_接口静态方法调用规则【操作】
如何在 Go 中正确反序列化 XML 多节点数组(解决仅解析首个元素的问题)
如何使用Golang实现错误包装与传递_Golangfmt.Errorf%w使用实践
Win10如何优化内存使用_Win10内存优化技巧【攻略】
MAC的“接续互通”功能无法使用怎么办_MAC检查蓝牙、Wi-Fi和相同Apple ID登录
Python配置文件操作教程_JSONINIYAML解析与应用实战
Windows 11如何查看系统激活密钥_Windows 11使用CMD或PowerShell命令找回Product Key
Win11怎么关闭粘滞键_彻底禁用Windows 11连按Shift粘滞键【步骤】
2025-12-31
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。