【问题标题】:Laravel Eloquent toArray / toJson with Carbon DateLaravel Eloquent toArray / toJson with Carbon Date
【发布时间】:2015-04-10 11:39:21
【问题描述】:

我有一个日期声明为 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 日期并不是真正的用户友好。

我该如何解决这个问题?

【问题讨论】:

    标签: php laravel serialization laravel-4 php-carbon


    【解决方案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 方法并在那里提供额外的数据,但我更喜欢事件方法,因为数据库的数据与我需要的值一起存储。

    在您的情况下,解决方案可能更简单。也许您提供了时间信息,但您没有提供秒数...?

    【讨论】:

      【解决方案2】:

      My2c

      我通过在每个使用 SqlServer 的模型中为格式定义添加微秒来解决

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

      我想知道是否有办法将其配置为每个模型的默认值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-05
        • 2016-10-24
        • 1970-01-01
        • 2014-03-02
        • 2016-07-13
        • 2017-04-01
        • 2013-05-27
        • 2020-07-09
        相关资源
        最近更新 更多