9

我正在努力更改由生成的时间戳列名称

php artisan migrate

命令。

我已经进行了以下更改。当我使用 eloquent 查询生成器时,它可以正确生成列名,但是当我使用上面的命令时,它仍然会生成“created_at”、“updated_at”和“deleted_at”。谁能帮我吗?非常感谢。

/* vendor\framework\src\Illuminate\Database\Eloquent\Model.php */

/**
 * The name of the "created at" column.
 *
 * @var string
 */
const CREATED_AT = 'datetime_created';

/**
 * The name of the "updated at" column.
 *
 * @var string
 */
const UPDATED_AT = 'datetime_updated';

/**
 * The name of the "deleted at" column.
 *
 * @var string
 */
const DELETED_AT = 'datetime_deleted';

/* vendor\framework\src\Illuminate\Database\Schema\Blueprint.php */

/**
 * Indicate that the timestamp columns should be dropped.
 *
 * @return void
 */
public function dropTimestamps()
{
    $this->dropColumn('datetime_created', 'datetime_updated');
}

/**
 * Add a "deleted at" timestamp for the table.
 *
 * @return void
 */
public function softDeletes()
{
    $this->timestamp('datetime_deleted')->nullable();
}
/**
 * Add creation and update timestamps to the table.
 *
 * @return void
 */
public function timestamps()
{
    $this->timestamp('datetime_created');

    $this->timestamp('datetime_updated');
}
/**
 * Add a "deleted at" timestamp for the table.
 *
 * @return void
 */
public function softDeletes()
{
    $this->timestamp('datetime_deleted')->nullable();
}

PS我知道修改“核心”不是一个好主意。如果有人能告诉我扩展这些课程的最佳方式,我将不胜感激。

4

1 回答 1

19

永远不要编辑vendor文件夹下的代码。首先,它通常(默认情况下)不包含在您的存储库中,因此如果您或其他任何人想要在另一台机器上工作,您将丢失更改。其次,它会在您执行 a 时被覆盖composer update


好吧,话虽如此,让我们开始处理这种“修改核心”的恐怖。对于Illuminate\Database\Eloquent\Model.php,只需创建一个基本模型,您将从中扩展所有后续模型,并覆盖其中的常量:

应用程序/模型/BaseModel.php

abstract class BaseModel extends Eloquent {

    /**
     * The name of the "created at" column.
     *
     * @var string
     */
    const CREATED_AT = 'datetime_created';

    /**
     * The name of the "updated at" column.
     *
     * @var string
     */
    const UPDATED_AT = 'datetime_updated';

    /**
     * The name of the "deleted at" column.
     *
     * @var string
     */
    const DELETED_AT = 'datetime_deleted';

}

然后,对于这个Illuminate\Database\Schema\Blueprint案子......好吧,它变得血腥:

  1. 扩展..\Schema\Blueprint,覆盖你提到的方法。
  2. 扩展..\Schema\Builder,覆盖createBlueprint方法以使用您的新Blueprint类。
    • 还可以扩展..\Schema\MySqlBuilder以从您的新Builder类扩展。
  3. 扩展..\Connection,覆盖 getSchemaBuilder方法以使用您的新Builder类。
    • 还可以从您的新类中扩展..\MySqlConnection、扩展和扩展。..\PostgresConnection..\SqlServerConnection..\SQLiteConnectionConnection
    • 注意: ..\MySqlConnection还需要getSchemaBuilder扩展其方法以使用您的新MySqlBuilder类。
  4. Extend ..\ConnectionFactory,覆盖createConnection方法以使用您的扩展Connection类。
  5. 创建一个ServiceProvider以将您的新ConnectionFactory类注册为新db.factory组件,并将其添加到您的app/config/app.php文件中,在providers.

因此,经过半小时挖掘 Laravel 的源代码以弄清楚这一点,我得出的结论是,在迁移中简单地执行以下操作可能会更容易:

$table->timestamp(BaseModel::CREATED_AT);
$table->timestamp(BaseModel::UPDATED_AT);
于 2013-07-19T03:37:44.403 回答