Некоторое время мне хотелось попробовать Laravel, поэтому я потратил полдня на его настройку.

В Windows я установил: WAMP 32-разрядный с PHP 5.4, Драйверы для SQL Server 3.0 от Microsoft (поэтому я использую 32-разрядный WAMP) и Composer.

Затем я создал проект, скачал Laravel и генераторы. Я создал эшафот, чтобы увидеть, какой код он генерирует, и протестировать его.

Мое первое действие "создать" не удалось из-за ошибки преобразования nvarchar в datetime. Я вставил запрос в SQL Server Management Studio (SSMS) и запустил его с теми же результатами.

Ошибка исходит из формата даты. Laravel выразился так: «2013-12-17 16: 55: 124». Но перед запросом он отправляет некоторый набор на SQL Server, и один очень интересный:

set dateformat dmy

Для меня set dateformat dmy означает, что он ожидает такую ​​дату: "17-12-2013 16: 55: 124"

В SSMS измените установленный формат даты на:

set dateformat ymd

Или изменение формата даты в запросе заставляет его работать.

Я не думаю, что это ошибка. Я просто думаю, что что-то неправильно настроено. Я просто не знаю что.

2
elfif 17 Дек 2013 в 20:49

2 ответа

Лучший ответ

Я наконец нашел способ, который кажется довольно чистым. Уловка состоит в том, чтобы заставить Laravel использовать datetime2 вместо datetime с SQL Server.

Для этого вам необходимо внести следующие изменения:

В Illuminate / Database / Schema / Grammars / SqlServerGrammar.php

protected function typeDateTime(Fluent $column)
{
    return 'datetime'; // Change to datetime2
}

А также

protected function typeTimestamp(Fluent $column)
{
    return 'datetime'; // Change to datetime2
}

Затем в Illuminate / Database / Query / Grammars / SqlServerGrammar.php:

public function getDateFormat()
{
    return 'Y-m-d H:i:s.000'; // change to 'Y-m-d H:i:s.0000000'
}

Надеюсь, это кому-то поможет ...

1
Peter Mortensen 27 Сен 2015 в 17:17

Я исправил это, используя DB :: raw с синтаксисом SQL-сервера для datetime.

public function datetime() {

    $addDate = DB::insert("insert into TABLE (date) values (convert(date,'$date',127))");

}

Я не знаю точно, почему это происходит, но та же функция с классическим синтаксисом Laravel DB возвращает SQLSTATE [22007].

public function datetime() {

    $addDate = DB::table('TABLE')
    ->insert([
        'date'=> $date]);

   // return SQLSTATE[22007]
}
0
ErnstShackleton 8 Мар 2017 в 21:40