在Laravel中使用迁移和模型类有什么好处?

时间:2017-09-18 05:20:45

标签: php mysql laravel

  

迁移(php artisan migrate)

我正在为我的应用程序使用laravel。我阅读了laravel doc,其中他们说“如果你曾经告诉队友手动将列添加到他们的本地数据库模式中,那么你就遇到了数据库迁移解决的问题。”

但我正在与我的2名团队成员合作,我们使用的是实时数据库服务器。我改变的一切都转到了实时数据库,所有人都找到了。 如果我使用实时数据库,我应该使用db migtration,因为DOC说它对本地数据库很有用吗?

  

模型类

我仅将模型类用于Auth(用于表用户和角色)。对于我的所有查询结果,我使用了原始的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中检查我的复杂查询然后粘贴到我的控制器函数中。我不确定是否可以在使用模型类的雄辩查询中进行一些复杂的查询。

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

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

4 个答案:

答案 0 :(得分:4)

简答:

  

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

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

  

我应该总是对我的所有表使用Model类

由你决定。您必须确切知道您正在进行的迁移。模型类将帮助您轻松实现并减少人为问题。

  

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

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

  

迁移是否可以直播?

是的,它适用于任何环境

答案 1 :(得分:1)

首先,任何人都不建议在现场制作服务器上进行开发,你真的应该立即停止。

其次,迁移通过轻松保持所有数据库实例同步来帮助解决这个问题。

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

至于Eloquent,你不必使用它。我不选择。但是你真的应该利用所谓的数据传输对象(DTO)并使用原始SQL创建自己的数据库访问层(DBAL)。只是不要随便在你的应用程序中散布它。

答案 2 :(得分:1)

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

  

我的问题是,我是否应该始终使用实时或本地数据库进行迁移?

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

  

我应该总是对我的所有表使用Model类吗?

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

  

即使我处于生产模式,我也应该使用迁移(我的意思是如果需要的话)   当应用程序在现场时从我的客户端进行一些修改?

是肯定的。由于迁移用于管理对db的增量,可逆更改,因此始终建议在迁移和开发环境中保持相同的迁移。当您运行migrate命令时,它只会将新的迁移(up方法)作为增量运行,并且当您运行rollback命令时,它会按照上次运行迁移的顺序反转迁移(down方法)。这样您就可以轻松地进行增量更新。如果出现任何问题,可以恢复到之前的状态。(仅当写入down方法以反转在up方法上执行的操作时)。创建表你可以使用Schema :: create并修改你可以使用Schema :: table。

  

迁移是否可以直播?

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

答案 3 :(得分:0)

Ad Migrations - 我的经历。

当我开始使用Laravel时,我没有获得迁移的全部好处,因此我使用phpMyAdmin手动管理我的数据库。它在localhost上运行良好。但是,我在localhost上开发了我的项目,而不是在舞台服务器上测试它,然后将其移动到生产中。突然间,我有3个数据库需要管理,它们应该是相同的。

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

通过迁移,您可以跟踪开发期间肯定会发生的更改。例如。添加新列,更改数据类型,更改外键等。

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