2015-02-10 8 views
2

У меня есть модель с датой объявленного углеродаLaravel Eloquent ToArray/toJson с Carbon Дата

public $dates = array('created_at', 'submitted_at'); 

Когда я пытаюсь преобразовать модель в массив с ->toArray() или при создании ответа JSON, я получаю сообщение об ошибке :

[2015-02-10 12:25:02] local.ERROR: exception 'InvalidArgumentException' with message 'Data missing' in /var/www/public/app.orders/vendor/nesbot/carbon/src/Carbon/Carbon.php:385 
Stack trace: 
#0 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2671): Carbon\Carbon::createFromFormat('Y-m-d H:i:s.000', '2015-02-09 16:0...') 
#1 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2276): Illuminate\Database\Eloquent\Model->asDateTime('2015-02-09 16:0...') 
#2 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2255): Illuminate\Database\Eloquent\Model->attributesToArray() 
#3 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Support/Collection.php(707): Illuminate\Database\Eloquent\Model->toArray() 
#4 [internal function]: Illuminate\Support\Collection->Illuminate\Support\{closure}(Object(app\Entities\Order)) 
#5 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Support/Collection.php(709): array_map(Object(Closure), Array) 
#6 /var/www/public/app.orders/app/controllers/OrdersController.php(49): Illuminate\Support\Collection->toArray() 
#7 [internal function]: OrdersController->index('37') 
#8 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(231): call_user_func_array(Array, Array) 
#9 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(93): Illuminate\Routing\Controller->callAction('index', Array) 
#10 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(62): Illuminate\Routing\ControllerDispatcher->call(Object(OrdersController), Object(Illuminate\Routing\Route), 'index') 
#11 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Routing/Router.php(962): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request), 'OrdersControlle...', 'index') 
#12 [internal function]: Illuminate\Routing\Router->Illuminate\Routing\{closure}('37') 
#13 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Routing/Route.php(109): call_user_func_array(Object(Closure), Array) 
#14 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Routing/Router.php(1028): Illuminate\Routing\Route->run(Object(Illuminate\Http\Request)) 
#15 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Routing/Router.php(996): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request)) 
#16 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(775): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request)) 
#17 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(745): Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request)) 
#18 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Session/Middleware.php(72): Illuminate\Foundation\Application->handle(Object(Illuminate\Http\Request), 1, true) 
#19 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Cookie/Queue.php(47): Illuminate\Session\Middleware->handle(Object(Illuminate\Http\Request), 1, true) 
#20 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Cookie/Guard.php(51): Illuminate\Cookie\Queue->handle(Object(Illuminate\Http\Request), 1, true) 
#21 /var/www/public/app.orders/vendor/stack/builder/src/Stack/StackedHttpKernel.php(23): Illuminate\Cookie\Guard->handle(Object(Illuminate\Http\Request), 1, true) 
#22 /var/www/public/app.orders/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(641): Stack\StackedHttpKernel->handle(Object(Illuminate\Http\Request)) 
#23 /var/www/public/app.orders/public/index.php(49): Illuminate\Foundation\Application->run() 
#24 {main} [] [] 

Если удалить DateMutator, все идет хорошо, но я хотел бы сохранить его в качестве даты MSSQL, извлекаемых на самом деле не пользователь fiendly.

Как я могу это решить?

ответ

1

У меня была такая же проблема, и я нашел обходное решение. Кажется, что функция ToArray вызывает следующее:

Carbon\Carbon::createFromFormat('Y-m-d H:i:s.000', ...

в вашей версии и в шахте:

Carbon\Carbon::createFromFormat('Y-m-d H:i:s', ...

и как-то не все запрошенные данные (год/месяц ... минуты/секунды).

Так что я сделал то, что в событиях Модели, которые приносят или хранят модель в БД, я устанавливаю даты вручную, считая, что остальная часть кода не предоставляет «недопустимые» значения для этих дат. Конечно, если в какой-то момент указать недопустимые значения этих дат и вызвать метод toArray перед любым сохранением в БД, проблема все еще возникает.

public static function boot() 
{ 
    parent::boot(); 

    static::saving(function($record){ 
     if (empty($record->the_date_attribute)) { 
      // Perhaps set a default value here 
     } else { 
      if($record->the_date_attribute instanceof \Carbon\Carbon) 
       $record->the_date_attribute->setTime(0,0,0); 
     } 
    } 
    static::restored(function($record){ 
     if (empty($record->the_date_attribute)) { 
      // Perhaps set a default value here 
     } else { 
      if($record->the_date_attribute instanceof \Carbon\Carbon) 
       $record->the_date_attribute->setTime(0,0,0); 
     } 
    } 
} 

В моем случае я устанавливаю время на 0, так как в моей БД поле имеет тип даты. Другим возможным обходным путем является переопределение метода toArray и предоставление дополнительных данных, но я предпочитаю события aprroach, поскольку данные в БД хранятся со значениями, в которых они мне нужны.

В вашем случае решение может быть проще. Возможно, вы предоставляете информацию о времени, но вы не предоставляете секунды ...?

0

My2c

Я решил, добавив микросекунд в определении формата в каждой модели, которая использует SQLSERVER

protected $dateFormat = 'Y-m-d H:i:s.u';

Я хотел бы знать, если есть способ настроить его по умолчанию для каждой модели

Смежные вопросы