Kam*_*ski 1 database-design laravel laravel-migrations
我有以下情况(我将其描述为历史线):
User设置项目女巫模型(和users表)一段时间后,我添加了 user_modules 表多对多,并且我被迫在迁移文件B中的架构更新期间初始化该数组。我这样做是通过
User::chunk(100, function($users) {
foreach ($users as $user) {
$user->userModule()->create();
}
});
Run Code Online (Sandbox Code Playgroud)User中添加软删除(列 delete_at)和模型中的字段来更新模型和表。$dates=['deleted_at']Userphp artisan:migrate中出现错误:[Illuminate\Database\QueryException (42S22)]
SQLSTATE[42S22]: 未找到列: 1054 'where 子句' 中的未知列 'users.deleted_at' (SQL: select * fromuserswhereusers.deleted_atis null order byusers.idasc limit 100 off set 0)
所以当前User模型与迁移文件B不兼容
遇到这种情况该如何处理呢?
我在哪里犯了错误,该怎么做才能防止以后再出现类似情况?
这是因为软删除。当您将 SoftDeletes 特征添加到模型中时,它将自动添加where users.deleted_at is null到所有查询中。解决这个问题的最佳方法是withTrashed()在迁移 B 中添加到您的查询中。
为此,请将迁移 B 中的查询更改为如下所示。这应该删除它尝试访问不存在deleted_at列的部分。毕竟,此迁移并不知道您稍后要添加软删除,因此访问所有用户(包括那些已删除的用户)是非常有意义的。
User::withTrashed()->chunk(100, function($users) {
foreach ($users as $user) {
$user->userModule()->create();
}
});
Run Code Online (Sandbox Code Playgroud)
您始终可以在运行迁移之前注释掉用户模型上的 SoftDelete 特征,但这是一个临时修复,因为您需要向所有未来的开发人员解释它。而且,有时跑步也非常方便php artisan migrate:fresh。您不想每次都记住注释掉该特征,因此添加withTrashed()对我来说似乎是最理想的解决方案。
最后一点,我强烈建议不要在迁移中添加种子。迁移只能用于架构更改。在这种情况下,我会使用控制台命令或控制台命令的组合。
例如,您可以创建一个由 触发的控制台命令php artisan check:user-modules。在此命令中,您可以使用以下命令,仅当用户模块尚不存在时才会创建用户模块。
User::chunk(100, function($users) {
foreach ($users as $user) {
if (!$user->userModule()->exists()) {
$user->userModule()->create();
}
}
});
Run Code Online (Sandbox Code Playgroud)
您应该能够随时运行此命令,因为它不会覆盖现有的用户模块。
| 归档时间: |
|
| 查看次数: |
517 次 |
| 最近记录: |