【问题标题】:How to make a Migration file based on a model in Laravel如何在 Laravel 中基于模型制作迁移文件
【发布时间】:2019-02-19 16:32:20
【问题描述】:

如果我有一些模型,具有非默认功能(如软删除或自定义 id 名称)并想从中创建一个迁移文件,其中包含所有这些属性?所以这是我的模型:

class Test extends Model
{
   use SoftDeletes;

   protected $primaryKey = 'test_id';
   protected $table = 'my_flights';
   protected $dates = ['deleted_at'];
}

我希望我的迁移文件基于它。但是,当我使用命令php artisan make:migration create_test(s)_table(我尝试了testtests)以及参数--create--table 时,我得到了迁移文件,因为没有任何模型:

class CreateTestTable extends Migration
{
    public function up()
    {
        Schema::create('test', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }  ...

【问题讨论】:

  • Laravel 没有原生支持,但可能有第三方包。
  • @JonasStaudenmeir 所以默认情况下我应该两次跟踪相同的属性:一个在模型文件中,一个在迁移文件中?在这种情况下,如果我在模型中设置自定义主键名称并在迁移文件中设置其他名称(抱歉,我是新手,还没有自己测试过)怎么办?
  • 是的,你必须自己保持同步。
  • 通常您不需要“跟踪”模型的属性,因为 Model 类将直接从数据库元数据中获取大部分属性。 Eloquent ORM 就是约定优于配置。您只需要对模型添加特殊条件,例如不遵循约定的属性和相关的数据类型转换。
  • @Malta 嗯.. 感谢您的提示。我不知道我必须在我的模型中只放入不符合约定的属性。现在我需要重新考虑使用eloquent))。

标签: php laravel orm eloquent migration


【解决方案1】:

在正常开发中,迁移先于模型细节。迁移包含模式定义,而不是模型。 Eloquent 模型遵循活动记录模式,不包含列的类型定义。如果遵循命名约定,则无需在模型中指定有关表或列的任何内容。

make:migration 命令不会从现有模型或数据库表中提取任何内容。有一个包支持从现有数据库架构创建迁移:https://github.com/Xethron/migrations-generator,但不支持模型本身。

【讨论】:

  • 主要我想做的是在不同的文件(模型和迁移)中跟踪相同的属性两次。所以在this question的回答中发现无法创建模型表单迁移,所以我想也许倒序是可能的。
  • 跟踪属性是什么意思?您在模型的哪个位置跟踪属性?
  • 例如:protected $primaryKey = 'test_id'; protected $table = 'my_flights';。因此,如果我希望我的 Migration 文件与模型相似,我也必须在其中放入相同的值。当我想改变时,例如主键名称,我必须在两个文件中进行更改。
  • 好吧,如果您遵循命名约定,则 $table 和 $primaryKey 都不是必需的,但即便如此,我也很难在两者中都称其为跟踪属性..
  • 请通过在其中添加此评论和问题中的评论来编辑您的答案,我会接受它;)
猜你喜欢
  • 2019-11-23
  • 2017-09-27
  • 2015-10-22
  • 2018-03-09
  • 2019-11-29
  • 2017-01-05
  • 2019-03-28
  • 1970-01-01
  • 2017-09-27
相关资源
最近更新 更多