2015-02-28 22 views
19

Tôi đã cố gắng với bất cứ cú pháp và không thể suy nghĩ làm thế nào tôi có thể viết này một cách chính xác:Run SQL thô trong di cư

Schema::table('users', function(Blueprint $table){ 
    $sql = <<<SQL 
     ALTER TABLE 'users' MODIFY 'age' DATETIME 
    SQL; 
    DB::connection()->getPdo()->exec($sql); 
}); 

cũng đã cố gắng với

DB::statement('ALTER TABLE \'users\' MODIFY COLUMN DATETIME); 

và đôi dấu ngoặc kép và vân vân . Tôi luôn nhận được thông tin sau khi tôi di chuyển:

Lỗi cú pháp hoặc vi phạm truy cập: 1064 Bạn có lỗi trong cú pháp SQL; kiểm tra
hướng dẫn tương ứng với phiên bản máy chủ MariaDB của bạn cho đúng cú pháp để sử dụng gần '' người sử dụng sửa đổi 'tuổi' DATETIME' tại dòng 1

Vâng, tôi đã kiểm tra, MariaDB sử dụng cú pháp của MySQL (tại ít nhất cho trường hợp này).

+0

Chính xác thì bạn đang cố gắng làm gì? – Philipp

Trả lời

28

Sử dụng back-ve thay vì dấu nháy đơn để thoát khỏi định danh trong MySQL:

$sql = 'ALTER TABLE `users` MODIFY `age` DATETIME'; 

Trong trường hợp này bạn có thể bỏ trốn ở tất cả.

+6

Có lý do nào để truy vấn nằm trong một đóng của lược đồ nếu không sử dụng đối tượng Blueprint? –

+0

Bạn không cần phải đóng Schema, nó chỉ là các truy vấn phụ thuộc riêng biệt. Ngoài ra, bạn có thể chạy truy vấn trong câu lệnh DB :: ('QUERY'). – KorbenDallas

+0

@KorbenDallas: Trong trường hợp của câu hỏi này, chủ yếu là lý do tại sao phương pháp tiếp cận của anh không hoạt động trong MySQL, không phải là cách làm cho nó tốt hơn trong Laravel (mà tôi không quen) – potashin

14

Sự cố (như @postashin đã nói) là dấu gạch chéo ngược.

Tính đến Laravel 5 (không chắc chắn về Laravel 4), bạn có thể đã làm điều này:

DB::statement('ALTER TABLE `users` MODIFY `age` DATETIME'); 

Trong thực tế, bạn thậm chí không cần lưng bọ ve như họ không cần phải thoát ra. Vì vậy, bạn có thể vừa viết:

DB::statement('ALTER TABLE users MODIFY age DATETIME'); 

Bạn không cần phải đóng cửa nếu bạn đang thực hiện một câu lệnh cơ sở dữ liệu.

Tuy nhiên một cách tiếp cận tốt hơn với những gì bạn đang làm là như sau:

Schema::table('users', function(Blueprint $table) { 
    $table->dateTime('age')->change(); 
}); 

Lưu ý là giải pháp cuối cùng đôi khi có thể nâng cao một lỗi do một lỗi trong Doctirine, mà thường xảy ra nếu bạn có một enum trong bảng (không chỉ là cột bạn đang thay đổi).

Để biết thêm thông tin, hãy xem: https://laravel.com/docs/5.4/migrations#modifying-columns

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