【问题标题】:What are the benefits of using migrations and model classes in Laravel?在 Laravel 中使用迁移和模型类有什么好处?
【发布时间】:2018-02-26 13:33:41
【问题描述】:

迁移(php artisan 迁移)

我正在为我的应用程序使用 laravel。我读过 laravel 文档,他们说:“如果您曾经不得不告诉队友手动将列添加到他们的本地数据库架构中,那么您就遇到了数据库迁移解决的问题。”

但我正在与我的 2 名团队成员一起工作,我们使用的是实时数据库服务器。我更改的所有内容都将进入实时数据库,并且所有人都找到了。 如果我使用 live db,我应该使用 db 迁移,因为 DOC 说它对本地 db 有用吗?

模型类

我仅将模型类用于身份验证(用于表用户和角色)。对于我的所有查询结果,我使用了原始 sql 查询,例如:

$hal = DB::select('SELECT TotalForeignTruck,
            (( UNIX_TIMESTAMP(truck_receivedate)- UNIX_TIMESTAMP(truck_entrydate))/60/60/24) AS HoltageDay
             FROM(
            SELECT 
            (SELECT truck_entry_regs.truckentry_datetime FROM  truck_entry_regs WHERE truck_entry_regs.manf_id=m.id  ORDER BY truck_entry_regs.id ASC LIMIT 1)AS truck_entrydate,
            (SELECT truck_entry_regs.receive_datetime FROM  truck_entry_regs WHERE truck_entry_regs.manf_id=m.id  ORDER BY truck_entry_regs.id DESC LIMIT 1)AS truck_receivedate,
            (SELECT COUNT(truck_entry_regs.id) FROM  truck_entry_regs WHERE truck_entry_regs.manf_id=m.id )AS TotalForeignTruck

            FROM manifests m
            WHERE m.manifest=? ) t', [$r->mani_No]);

    return json_encode($hal);

我正在使用它(sql raw),因为我可以在 sqlyog 中检查我的复杂查询,然后粘贴到我的控制器函数中。我不确定是否可以在使用模型类的 eloquent 查询中进行一些复杂的查询。

我的问题是,无论是实时数据库还是本地数据库,我都应该始终使用迁移吗? 我应该总是为我的所有表使用模型类吗? 即使我处于生产模式,我是否应该使用迁移(我的意思是如果在应用程序上线时需要我的客户进行一些修改)? 迁移可以实时进行吗?

我做错了吗?如何正确使用 laravel 功能?

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    简短回答:

    我是否应该始终使用迁移,无论是实时数据库还是本地数据库

    是的,迁移将有助于在多个环境之间同步数据库更改。这意味着每个更改都将完美且正确地更新到所有环境。如果出现任何错误,迁移将有助于安全回滚数据库。

    我是否应该始终为我的所有表格使用 Model 类

    这取决于你。您必须确切地知道您在迁移中做了什么。模型类将帮助您轻松实现并减少人为问题。

    即使我处于生产模式,我是否应该使用迁移(我的意思是如果在应用上线时需要我的客户进行一些修改)

    IMO,绝对是的 - 作为第一个答案

    迁移是否可以实时进行?

    是的,它应该适用于任何环境

    【讨论】:

      【解决方案2】:

      首先,任何人都不建议在实时生产服务器上进行开发,你真的应该立即停止。

      其次,迁移有助于轻松保持所有数据库实例同步。

      另一个巨大的优势是,随着时间的推移,您的 SQL 更改会记录在源代码中,并且可能会在修订控制(git 等)中进行备份。


      至于 Eloquent,您不必使用它。我没有,我选择。但是您确实应该利用所谓的数据传输对象 (DTO) 并使用原始 SQL 创建自己的数据库访问层 (DBAL)。只是不要随意地将它散布在您的应用程序上。

      【讨论】:

      • 您禁止在直播中使用迁移。但是,如果我正在与团队合作,那么如果我使用 git,所有成员将如何轻松获得数据库? usig 导出和导入 .sql 文件?
      • 您是否正在尝试将您的开发服务器数据复制到 live 中?
      • 例如:我的数据库连接将是来自 godaddy 的实时 IP。我将始终将此数据库用于本地工作。如果我的本地工作完成,那么我只会将文件上传到服务器。我可以这样做吗?或者我必须在本地完成所有操作然后上传数据库和文件?
      【解决方案3】:

      不建议在生产服务器上开发。

      我的问题是我应该始终使用迁移,无论是实时数据库还是本地数据库?

      是的。它不是必需的,但建议在两者中使用迁移,并且应该是相同的迁移文件,这将使源代码控制和管理更容易,并且可以测试兼容性问题。如果您以这种方式保持迁移,您只需 git clone 并从它所在的位置开始。

      我是否应该始终为我的所有表格使用 Model 类?

      并不是所有的表都需要有模型,但是对于每个对象实体,比如表(用户、会话、地址等)而不是数据透视表(多对多中间表。例如:像 user_role、role_permission) .在某些情况下,为枢轴创建模型也很好,假设您想将其用作实体(例如:可以为 customer_movie 枢轴创建一个名为 Subscription 的模型)。

      即使我处于生产模式,我是否应该使用迁移(我的意思是如果需要 当应用上线时,我的客户做了一些修改)?

      是的。由于迁移用于管理数据库的增量、可逆更改,因此始终建议在开发和生产环境中保持相同的迁移。当您运行 migrate 命令时,它只会以增量方式运行新的迁移(up 方法),而当您运行 rollback 命令时,它会按照最后一次运行迁移的顺序反转迁移(down 方法)。因此您可以轻松带来增量更新。如果出现任何问题,则可以恢复到以前的状态。(仅当编写 down 方法以反转 up 方法所做的事情时)。要创建表,您可以使用 Schema::create 并修改您可以使用 Schema::table。

      迁移是否可以实时进行?

      是的。它适用于开发和生产。当您在运行 php artisan migrate 时将环境设置为生产环境时,它会提示每个人确认安全。如果您只想运行所需的迁移,也可以这样做。

      【讨论】:

      • 第一段答案:如果我完成了一半的任务并且另一个成员想加入,他如何在 git clone 之后使用 db 获取所有数据?迁移是否包含数据? @瞄准
      • 迁移是否强制忘记sql知识,因为所有create,alter sql查询都由它管理?
      • 如果迁移操作数据,我们通常会这样做。假设如果迁移创建一个新列并将数据复制到我们在迁移文件中执行该过程。数据本身不包含在迁移中。因此,如果您想提供数据,请转储给他,或者虚拟数据播种机会这样做。
      • 不行吗?如果我的成员从 git 克隆并导入我的 .sql 文件,我将发送他从我的本地导出?
      • 不要使用 git 也不要将其包含在源代码中以共享转储。只需给他转储并说要导入。
      【解决方案4】:

      广告迁移 - 我的经验。

      当我开始使用 Laravel 时,我没有获得迁移的全部好处,所以我使用 phpMyAdmin 手动管理我的数据库。它在本地主机上运行良好。但是,我在 localhost 上开发了我的项目,然后在舞台服务器上对其进行了测试,然后将其移至生产环境。突然,我有 3 个数据库要管理,它们应该是相同的。

      发生的事情是,我忘记更新实时数据库,在将最新版本推送到生产环境后,由于数据库差异,网络在某个时候崩溃了,例如数据类型/外键/约束。将问题本地化是一场噩梦。

      迁移可让您跟踪在开发过程中肯定会发生的变化。例如。添加新列、更改数据类型、更改外键等。

      如果您在团队中工作,您的应用可能会有更多本地版本。如果没有迁移,数据库管理将变得非常困难。

      【讨论】:

      • 所以你建议使用迁移,对吧?但对我来说,这似乎很难!我现在使用直接 mysql (sqlyog) 并在 .sql 中导出,然后将其发送给我的成员,所有文件都由 git 管理。对于管理将有 50 多个表并且必须在生产期间管理/更改的项目,您的最终建议是什么?
      • @Fawel 任何能够跟踪更改的系统都比我做的任何手动操作要好。尽管起初看起来像是一个小项目,但麻烦不值得。所以,答案并不是那么简单。如果您现在使用的系统运行良好,那么您可能根本不需要迁移。似乎 SQLyog 是一个很棒的工具,可以涵盖迁移的所有内容。
      • @Fawel 考虑以下问题:1) 您是否能够完全跟踪数据库更改? 2) 在您的团队中传播数据库更新是否容易? 3) 是否可以跟踪谁在数据库结构中做了哪些更改? 4)在其他项目实例(本地、阶段、测试、生产)中应用数据库更改是否容易?如果您回答是,那么您的系统可能会完成所需的一切。
      • 我不确定!我告诉我我只使用 sqlyog。但是我想确定的是使用迁移。如果我使用迁移,我可以在模型中使用任何东西吗?我的意思是改变表,分配外键,mysql支持的所有数据类型? laravel 模型类是否支持这些?它(模型)有什么限制吗?如果我有时想对某些表使用 sqlyog 怎么办? @彼得马蒂斯科
      • @Fawel 你可以使用迁移来做任何事情。您还可以创建自己的纯 sql 查询。完全没有限制。迁移只是封装了一切。你试图做出的决定并不像你想象的那么严重。您可以在将来的任何时间创建迁移。它只会带来一些工作。
      猜你喜欢
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2023-01-30
      • 2020-10-27
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多