2015-03-20 16 views
15

Tôi đang sử dụng Laravel 4.2. Tôi đã thư viện sau nạp trong composer.jsonDi chuyển db Laravel - renameColumn error - Loại cơ sở dữ liệu không xác định enum được yêu cầu

"doctrine/dbal": "2.4.*", 

Tôi tạo ra cuộc di cư sau của tôi:

class RenameDeliveryNotesColumnOnOrderHeaderTable extends Migration { 

    public function up() 
    { 
     Schema::table('order_header', function(Blueprint $table) 
     { 
      $table->renameColumn('delivery_notes', 'packing_notes'); 
     }); 
    } 

} 

đâu delivery_notes loại cột là text.

Khi tôi chạy di cư, tôi nhận được lỗi sau:

[Doctrine\DBAL\DBALException] Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.

Bất cứ ý tưởng tại sao tôi nhận được lỗi này? Làm thế nào tôi nên đi về sửa chữa này? Tôi cần phải đổi tên một cột trong bảng của tôi. Có cách nào khác để đổi tên cột không?

+0

Tôi tin rằng lỗi này là do một di chuyển khác, không chính xác điều này. Hãy xem xét các di chuyển bạn có và havent đã được chạy chưa. –

+0

Tôi không còn di chuyển nào khác để chạy trước phiên bản này. đã được kiểm tra. – Latheesan

Trả lời

15

Tôi đã giải quyết vấn đề của bạn một chút và tôi phát hiện ra rằng đó là sự cố đã biết.

docs Laravel của (http://laravel.com/docs/4.2/schema#renaming-columns) nói rằng

Note: Renaming enum column types is not supported.

đây: https://github.com/laravel/framework/issues/1186

Bạn có thể tìm thấy một số cách giải quyết về vấn đề này. Và kể từ khi bạn nói rằng cột này không phải là enum, hãy nhìn vào @upngo bình luận 's:

"...The issue is renaming ANY column on a table that has an enum ."

Ngoài ra tôi tìm thấy bài viết này tập trung vào vấn đề này và đề xuất một tùy chọn có thể giúp bạn.

http://www.paulbill.com/110/laravel-unknown-database-type-enum-requested-doctrinedbalplatformsmysqlplatform-may-not-support-it

4

Bạn có thể thêm constructor tùy chỉnh để di cư và giải thích cho học thuyết rằng enum nên bị đối xử như chuỗi.

public function __construct(\Doctrine\DBAL\Migrations\Version $version) 
{ 
    parent::__construct($version); 

    $this->platform->registerDoctrineTypeMapping('enum', 'string'); 
} 
+0

Dường như không hoạt động trong các phiên bản hiện tại? Tôi đang ở trên Laravel 5.1 – Volatil3

+0

giống như ở đây trên Laravel 5.2 – Laurent

16

DB :: getDoctrineSchemaManager() -> getDatabasePlatform() -> registerDoctrineTypeMapping ('enum', 'string');

Điều này phù hợp với tôi trên Laravel 5.1

+0

nơi để chạy lệnh này? – Aditya

+0

Bạn có đặt nó trong một số loại tệp tin khởi động nào đó không? –

+2

không, bạn nên chạy tệp này từ tệp di chuyển của mình, tốt nhất trong phương thức xây dựng. – Gmatkowski

6

Tôi gặp sự cố này trong phiên bản Laravel 5.1.19 (LTS). Điều này là thực tế cho các phiên bản trước đó quá. Tôi muốn thông báo cho bạn khi tôi giải quyết vấn đề dựa trên các nhận xét trước đó.

Trước hết, tôi đã cố gắng mã tiếp theo trong tập tin chuyển đổi của tôi:

$table->renameColumn('column_name'); 

Nhưng sau khi lệnh php artisan migrate, tôi đã nhận lỗi sau:

[Symfony\Component\Debug\Exception\FatalErrorException] Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found

Như bạn đã biết DBAL đã được gỡ bỏ từ laravel cốt lõi và chúng tôi cần thêm nó vào composer.json. (Ví dụ: "require": {"doctrine/dbal": "2.5.1"}). tôi đặt DBAL theo yêu cầu và cố gắng một lần nữa để làm lệnh di chuyển nhưng đã nhận lỗi sau:

[Doctrine\DBAL\DBALException]
Unknown database type enum requested, Doctrine\DBAL\Platforms\MySqlPlatform may not support it.

Sau đó, tôi đã cố gắng sql liệu tiếp theo trong tập tin chuyển đổi của tôi: Đối up():

DB::statement("ALTER TABLE `table_name` CHANGE `old_column_name` `new_column_name` ENUM('first value', 'second_value', ...) DEFAULT 'first_value' AFTER `some_field`"); 

Đối down():

DB::statement("ALTER TABLE `table_name` CHANGE `new_column_name` `old_column_name` ENUM('first value', 'second_value', ...) DEFAULT 'first_value' AFTER `some_field`"); 

và hoạt động.

P.S. Để đổi tên các trường khác trong bảng chứa trường enum, chúng ta nên sử dụng cùng một lược đồ với sql thô như đã được viết trong các nhận xét trước.

1

Tôi đã gặp vấn đề tương tự với Laravel 5.1 và PostGres. Vì vậy, về cơ bản tôi đã sử dụng để tạo ra các DB::statement ENUM và giải quyết vấn đề:

DB::statement("CREATE TYPE e_users AS ENUM('data1','data2')");

Và sau đó:

DB::statement("ALTER TABLE users ADD COLUMN column e_users");

0

Dưới đây là câu trả lời cho Laravel 5.2.45+ (có thể làm việc trong 5.1 cũng , đã không kiểm tra hoặc kiểm tra bài viết nào, xin vui lòng cho tôi biết để tôi có thể cập nhật câu hỏi này)

Thêm dòng này trong bạn lên phương pháp:.

Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string'); 

Something như thế này:

public function up() 
{ 
    Schema::getConnection()->getDoctrineSchemaManager()->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string'); 
    Schema::table('users', function (Blueprint $table) { 
     $table->text('bio')->change(); 
    }); 
} 
0

Mặc dù tác giả ban đầu có vấn đề với Laravel 4, này một cách an toàn có thể được cố định trong Laravel 5 bởi chạm phiên bản của doctrine/dbal trong composer.json của bạn để ^2.6, như nó đã được cố định trong this PR trên phiên bản 2.6.0

Hãy chắc chắn để kiểm tra tính tương thích phá thay đổi trong release changelog

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