重构数据库及其数据的最佳方法是什么?(Laravel 5.2)

理查德·韦奇(Richard Wedge)

我正在尝试找出如何处理Laravel 5.2中迁移中的结构性数据以及与数据相关的更改。目前,我只是在对数据库进行结构更改后更改了现有数据。但这似乎与版本控制的代码相冲突。

一个简单的例子

owner_id应在teams表中添加一列简单迁移,没问题。此后,所有现有团队都应获得此ID。因此,我也将其放入了迁移中:

foreach ($teams as $team) {
    // get the first user of this team over a many-to-many-relationship-table `team_user`
    $team->owner_id = $team->users->first()->id;
    ...
}

乍一看效果很好。

经过几天的提交,我决定role在上述关系表中添加一个数据透视列我添加了迁移,并在团队模型中输入了以下内容:

public function users() {
    return $this->belongsToMany(...)->withPivot('role');
}

产生的问题

如果现在我要完全刷新本地数据库,则在第一次迁移时会出现错误。那是因为它调用了$ team-> users,但是在数据库的这种状态下role它尚不可用,因此方法调用失败。这就像版本控制和数据库迁移之间的转变。

是否有一个干净的解决方案?

预先感谢,理查德

安东尼奥·卡洛斯·里贝罗

通常,迁移是DDL(数据定义语言),而种子是DML(数据操作语言)。

迁移数据库表是有序的。您不能添加依赖于某些DDL的代码,这些代码可以在运行那些DDL之前执行。

您还需要考虑的另一件事是:迁移不是进行数据播种,修改和操作的地方,因为播种可能需要在开始播种之前完成所有数据定义。这就是Laravel具有数据种子的原因。

因此,播种,修复或更改数据之间没有区别,全都是DML。您可以在迁移中做到这一点,这不是禁止的,但是在迁移过程中,您必须非常小心,请撤消(关闭)该up方法中的每个步骤但是有时候很难操作回您的数据

您的问题是您试图通过关系访问某些数据,而这些数据尚未准备好(或已完成,或已播种),因为可以执行此操作的迁移尚未运行。因此,DDL和DML之间存在冲突,如果将它们分开对待,则不会发生冲突。

通常,数据播种仅用于测试,但是如果您确实需要,可以在播种器中执行以下操作:

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        if (app()->environment('testing')) {
            $this->call(TestingSeeders::class);
        }

        $this->call(ProductionReadySeeders::class);
    }
}

或者,您可以仅创建一个用于播种数据的命令:

Artisan::command('app:seed', function ($email)
{
    // Do whatever you need to seed your database tables
});

并与

php artisan app:seed

如果要确保每个人都获得了新版本(如果您的应用程序也获得了正确的数据),则可以使用Composer后期执行命令来这样做:

"post-install-cmd": [
   "Illuminate\\Foundation\\ComposerScripts::postInstall",
   "php artisan optimize",
   "php artisan migrate --force",
   "php artisan app:seed" 
],

"post-update-cmd": [
   "Illuminate\\Foundation\\ComposerScripts::postUpdate",
     "php artisan optimize",
     "php artisan migrate --force", 
     "php artisan app:seed"
]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

构造数据库表的最佳方法是什么?

来自分类Dev

当使用EF 5向Oracle 11gR2数据库添加订单时,为什么会收到InvalidOperationException?

来自分类Dev

Laravel数据库日志-最佳实践是什么

来自分类Dev

Symfony2-用默认值预填充实体数据库表的最佳方法是什么?

来自分类Dev

Yii2数据库架构最佳实践

来自分类Dev

Laravel 5数据库关系类型

来自分类Dev

在Laravel中构造以下数据库查询的最佳方法是什么

来自分类Dev

Laravel 5获取数据库前缀

来自分类Dev

Symfony2实现数据库翻译的最佳方法

来自分类Dev

在Laravel 5上的表单和模型之间进行数据验证的最佳方法是什么?

来自分类Dev

在Asp.Net MVC 5中实现多个数据库的最佳实践是什么?

来自分类Dev

访问2个不同数据库的最佳方法是什么?

来自分类Dev

在zend Framework 2中的动作之间保留数据的最佳方法是什么?

来自分类Dev

从数据库获取数据的最佳方法是什么?

来自分类Dev

从数据库生成网站的最佳方法是什么

来自分类Dev

将Fancybox 2选项转换为HTML5数据属性的规则是什么?

来自分类Dev

Grails:在迁移/更新数据库时,MD5SUM的作用是什么?

来自分类Dev

laravel 5和Ajax从数据库获取数据:

来自分类Dev

Laravel 5:数据库迁移(帮助!)

来自分类Dev

从Symfony2中受凭据保护的URL检索数据的最佳方法是什么?

来自分类Dev

Laravel 5数据库会话(Laravel 5.0)

来自分类Dev

在角度材料 2/4 中使用数据表的最佳解决方法是什么?

来自分类Dev

LARAVEL 数据库连接的最佳方式是什么

来自分类Dev

Rails 5,将图像保存到数据库的最佳方法?

来自分类Dev

Angular2/5 搜索数据库并在新页面上显示结果

来自分类Dev

轮询数据库时的最佳方法是什么?

来自分类Dev

优化海量 CouchDB 数据库的最佳方法是什么?

来自分类Dev

在多个数据库上运行 Laravel 计划任务的最佳方法是什么?

来自分类Dev

备份sqlite数据库的最佳方法是什么?

Related 相关文章

  1. 1

    构造数据库表的最佳方法是什么?

  2. 2

    当使用EF 5向Oracle 11gR2数据库添加订单时,为什么会收到InvalidOperationException?

  3. 3

    Laravel数据库日志-最佳实践是什么

  4. 4

    Symfony2-用默认值预填充实体数据库表的最佳方法是什么?

  5. 5

    Yii2数据库架构最佳实践

  6. 6

    Laravel 5数据库关系类型

  7. 7

    在Laravel中构造以下数据库查询的最佳方法是什么

  8. 8

    Laravel 5获取数据库前缀

  9. 9

    Symfony2实现数据库翻译的最佳方法

  10. 10

    在Laravel 5上的表单和模型之间进行数据验证的最佳方法是什么?

  11. 11

    在Asp.Net MVC 5中实现多个数据库的最佳实践是什么?

  12. 12

    访问2个不同数据库的最佳方法是什么?

  13. 13

    在zend Framework 2中的动作之间保留数据的最佳方法是什么?

  14. 14

    从数据库获取数据的最佳方法是什么?

  15. 15

    从数据库生成网站的最佳方法是什么

  16. 16

    将Fancybox 2选项转换为HTML5数据属性的规则是什么?

  17. 17

    Grails:在迁移/更新数据库时,MD5SUM的作用是什么?

  18. 18

    laravel 5和Ajax从数据库获取数据:

  19. 19

    Laravel 5:数据库迁移(帮助!)

  20. 20

    从Symfony2中受凭据保护的URL检索数据的最佳方法是什么?

  21. 21

    Laravel 5数据库会话(Laravel 5.0)

  22. 22

    在角度材料 2/4 中使用数据表的最佳解决方法是什么?

  23. 23

    LARAVEL 数据库连接的最佳方式是什么

  24. 24

    Rails 5,将图像保存到数据库的最佳方法?

  25. 25

    Angular2/5 搜索数据库并在新页面上显示结果

  26. 26

    轮询数据库时的最佳方法是什么?

  27. 27

    优化海量 CouchDB 数据库的最佳方法是什么?

  28. 28

    在多个数据库上运行 Laravel 计划任务的最佳方法是什么?

  29. 29

    备份sqlite数据库的最佳方法是什么?

热门标签

归档