2015-07-22 27 views
7

Tôi muốn trả về INT dưới dạng số nguyên từ cơ sở dữ liệu của tôi. Tại thời điểm này tất cả các giá trị được nạp dưới dạng Chuỗi. Cơ sở dữ liệu là MSSQL 2012 và tôi sử dụng trình điều khiển PDO (cho v5.6).Cài đặt Laravel PDO?

Đang cố gắng để thiết lập các thuộc tính ở đây (như here on fideloper.com, nhưng tôi không biết nếu đó là vẫn có thể):

'sqlsrv' => [ 
     'driver' => 'sqlsrv', 
     'charset' => 'utf8', 
     'prefix' => '', 
     ...... 
     'options' => array(
      PDO::ATTR_STRINGIFY_FETCHES => false, 
      PDO::ATTR_EMULATE_PREPARES => false, 
     ), 
    ], 

Nhưng luôn luôn nhận được một lỗi:

SQLSTATE[IMSSP]: The given attribute is only supported on the PDOStatement object. 

Làm thế nào tôi có thể đặt bất kỳ cài đặt nào cho Trình điều khiển PDO để trả về INT dưới dạng Số nguyên và không phải là Chuỗi.

này vẫn không làm việc:

$pdo = DB::connection()->getPdo(); 
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false); 
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
.. do ORM Query 

Đưa các lỗi tương tự.

Có thể ai cũng có thể giúp tôi?

+0

Nó có hoạt động khi bạn không đặt thuộc tính không? Bạn có thể xem xét việc mở một vấn đề trên git repo –

+0

Mọi thứ hoạt động tốt, bị bệnh chỉ nhận được TẤT CẢ các giá trị số như chuỗi trở lại từ laravel ORM.Ill sử dụng điều này như một RESTful Webservice, và ngu ngốc của nó để chuyển đổi từng giá trị từ IO sang đúng kiểu dữ liệu;) - vì vậy nó sẽ rất tuyệt nếu tôi có thể nhận được các giá trị như số. – derdida

+0

Một điều khác cần xem xét là chuyển đổi 'EMULATE_PREPARES'. –

Trả lời

3

Tôi tin rằng vấn đề này liên quan đến trình điều khiển PDO được sử dụng (các cài đặt được cài đặt bằng PHP, không phải cấu hình laravel).

Không hoàn toàn những gì bạn đang tìm kiếm nhưng có khả năng giải quyết được sự cố của bạn. Vì laravel 5 là một tính năng phôi trên hùng hồn, nơi các cột của bạn sẽ tự động được đúc thành các loại được xác định trước của bạn. Xem http://laravel.com/docs/5.0/eloquent#attribute-casting

// Eloquent Model 
protected $casts = [ 
    'int_column' => 'int', 
]; 

bạn int_column sau đó sẽ tự động được đúc đến một int khi mô hình được lấy từ cơ sở dữ liệu

+0

Cảm ơn - nếu bị bệnh bằng tay, nó hoạt động tốt - nhưng đôi khi bị bệnh cần phải tham gia từ các bảng khác nhau, vì vậy tôi không thể truyền mọi giá trị (hoặc?) - vì nó không được lưu trữ trong mô hình của tôi. Tôi cũng sẽ kiểm tra cấu hình PDO mặc định - nhưng đây chắc chắn là một giải pháp tốt. – derdida

+0

Chúng tôi cũng tìm thấy vấn đề này, có vẻ như trình điều khiển MSSQL PDO trả về tất cả dữ liệu dưới dạng chuỗi. Chúng tôi đang sử dụng ZF và thêm một lớp tuyên bố tùy chỉnh bằng cách sử dụng PDOStatement :: getColumnMeta để tự động truyền dữ liệu đến đúng loại. Có lẽ Lavalel có chức năng tương tự. – bstoney

7

Tôi biết đây là một chủ đề cũ, nhưng tôi tìm thấy một giải pháp toàn cầu cho vấn đề này cho MSSQL trình điều khiển và PHP 7 (thay đổi duy nhất ảnh hưởng đến tất cả các bảng/mô hình). Hy vọng rằng điều này sẽ giúp những người khác đang đấu tranh với nhau.

  1. Tải phiên bản mới nhất của trình điều khiển từ Kho lưu trữ Git (Microsoft/msphpsql). Phiên bản hiện tại được phát hành trên trang Tải xuống của Microsoft là phiên bản cũ hơn và sẽ không hoạt động (kể từ ngày 13 tháng 9 năm 2016).
  2. Sao chép các tệp DLL thích hợp vào thư mục php/ext của bạn (thay thế/xóa phiên bản cũ hơn). Bạn có thể sẽ cần phải dừng/khởi động máy chủ web của bạn (chắc chắn, nếu IIS) để giải phóng các tập tin gốc để thay thế/xóa. Nếu tên tệp đã thay đổi từ phiên bản trước đó bạn đã cài đặt, hãy cập nhật tệp php.ini của bạn.
  3. Cập nhật cấu hình điều khiển bao gồm các PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE tham số mới:

    'sqlsrv' => [ 
        'driver' => 'sqlsrv', 
        'host' => env('DB_HOST', 'localhost'), 
        'database' => env('DB_DATABASE', 'database'), 
        'username' => env('DB_USERNAME', 'laravel'), 
        'password' => env('DB_PASSWORD', 'password#1'), 
        'charset' => 'utf8', 
        'prefix' => '', 
        'options' => array(
         PDO::ATTR_STRINGIFY_FETCHES => false, 
         PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE => true 
        ), 
    ], 
    

Đối với lời giải thích của giải pháp, tôi thấy nó bằng cách làm việc theo cách của mình thông qua mã nguồn trên Git Repository. Tất nhiên sẽ dễ dàng hơn nhiều nếu tôi đã đọc phần Thông báo của tệp README trước:

July 28, 2016 (4.1.0): Thanks to the community's input, this release expands drivers functionalities and also includes some bug fixes:

  • SQLSRV_ATTR_FETCHES_NUMERIC_TYPE connection attribute flag is added to PDO_SQLSRV driver to handle numeric fetches from columns with numeric Sql types (only bit, integer, smallint, tinyint, float and real). This flag can be turned on by setting its value in PDO::setAttribute to true , For example, $conn->setAttribute(PDO::SQLSRV_ATTR_FETCHES_NUMERIC_TYPE,true); If SQLSRV_ATTR_FETCHES_NUMERIC_TYPE is set to true the results from an integer column will be represented as an int , likewise, Sql types float and real will be represented as float . Note for exceptions:
    • When connection option flag ATTR_STRINGIFY_FETCHES is on, even when SQLSRV_ATTR_FETCHES_NUMERIC_TYPE is on, the return value will still be string.
    • When the returned PDO type in bind column is PDO_PARAM_INT , the return value from a integer column will be int even if SQLSRV_ATTR_FETCHES_NUMERIC_TYPE is off.
Các vấn đề liên quan