2013-07-18 21 views
8

Tôi đang đấu tranh để thay đổi tên cột timestamp được tạo ra bởiLàm cách nào để thay đổi tên cột dấu thời gian khi sử dụng "di chuyển thủ công"?

php artisan migrate 

lệnh.

Tôi đã thực hiện thay đổi sau. Khi tôi sử dụng trình tạo truy vấn hùng hồn, nó có thể tạo tên cột một cách chính xác, nhưng khi tôi sử dụng lệnh trên, nó vẫn tạo ra "created_at", "updated_at" và "deleted_at". Ai có thể giúp tôi không? Cảm ơn rất nhiều.

/* 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(); 
} 

T.B. Tôi biết nó không phải là một ý tưởng tốt để sửa đổi "lõi". Nếu ai đó có thể cho tôi biết cách tốt nhất để mở rộng các lớp đó, tôi thực sự sẽ đánh giá cao nó.

Trả lời

19

Đừng bao giờ chỉnh sửa mã trong thư mục vendor. Đầu tiên, thường là (theo mặc định) không được mang theo kho lưu trữ của bạn, vì vậy bạn sẽ mất các thay đổi nếu bạn hoặc ai khác muốn làm việc trên một máy khác. Thứ hai, nó sẽ bị ghi đè tại thời điểm bạn thực hiện composer update.


Vâng, điều đó đang được nói, chúng ta hãy bắt đầu đối phó với điều này "sửa đổi cốt lõi" kinh dị. Đối với Illuminate\Database\Eloquent\Model.php, chỉ cần tạo một mô hình cơ sở, từ đó bạn sẽ được mở rộng tất cả các mẫu tiếp theo của bạn, và ghi đè lên các hằng số trong đó:

app/models/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'; 

} 

Sau đó, , đối với trường hợp Illuminate\Database\Schema\Blueprint ... Vâng, nó bị đẫm máu:

  1. Mở rộng ..\Schema\Blueprint, ghi đè các phương pháp bạn đã đề cập.
  2. Mở rộng ..\Schema\Builder, ghi đè createBlueprint phương pháp để sử dụng lớp Blueprint mới của bạn.
    • Đồng thời mở rộng ..\Schema\MySqlBuilder để mở rộng từ lớp Builder mới của bạn.
  3. Mở rộng ..\Connection, ghi đè getSchemaBuilder để sử dụng lớp học Builder mới.
    • Đồng thời mở rộng ..\MySqlConnection, ..\PostgresConnection, ..\SqlServerConnection..\SQLiteConnection để mở rộng từ lớp Connection mới của bạn.
    • Lưu ý:..\MySqlConnection cũng cần có phương thức getSchemaBuilder được mở rộng để sử dụng lớp MySqlBuilder mới của bạn.
  4. Mở rộng ..\ConnectionFactory, ghi đè createConnection phương pháp để sử dụng các lớp mở rộng Connection của bạn.
  5. Tạo ServiceProvider để đăng ký lớp ConnectionFactory mới của bạn làm thành phần db.factory mới và thêm nó vào tệp app/config/app.php của bạn, dưới providers.

Vì vậy, sau nửa giờ đào bới mã nguồn Laravel để con số đó ra, tôi đi đến kết luận rằng nó sẽ lẽ được dễ dàng hơn chỉ đơn giản là thực hiện như sau về sự di cư của bạn:

$table->timestamp(BaseModel::CREATED_AT); 
$table->timestamp(BaseModel::UPDATED_AT); 
+0

Tuyệt quá! Cảm ơn rất nhiều cho trả lời của bạn! Tôi thực sự đánh giá cao sự giúp đỡ của bạn. Kể từ khi tôi hoàn thành công việc của tôi tại văn phòng khoảng 8 giờ trước, tôi có lẽ chỉ có thể cho nó một thử vào ngày mai tại máy tính gia đình của tôi. – Jonathan

+0

Thakns rất nhiều Raphael! Những công việc này! – Jonathan

Các vấn đề liên quan