【问题标题】:How to change date format of timestamps on pivot in Laravel?如何更改 Laravel 中枢轴上时间戳的日期格式?
【发布时间】:2019-11-07 10:29:03
【问题描述】:

我正在尝试将整个应用程序中时间戳的日期类型(created_at、updated_at、deleted_at)从timestams 全局更改为timestampsTz。在迁移中没有问题。在单个模型中也是如此,因为我可以覆盖模型的$dateFormat 参数。

但我对包含时间戳的数据透视表有疑问,因为它们没有从我的模型中继承任何参数。

假设我有一个 productsattributes 表,它们之间有 attribute_product 轴,其中包含 valuetimestamps 等列。如果我尝试使用产品的值和时间戳检索所有属性,我会执行以下操作:$product->attributes 但我收到错误:

local.ERROR: Trailing data {"exception":"[object] (InvalidArgumentException(code: 0): Trailing data at \\vendor\\esbot\\carbon\\src\\Carbon\\Carbon.php:910)
[stacktrace]
#0 \\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Eloquent\\Concerns\\HasAttributes.php(716): Carbon\\Carbon::createFromFormat('Y-m-d H:i:s', '2019-06-25 16:1...')
#1 \\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Eloquent\\Concerns\\HasAttributes.php(739): Illuminate\\Database\\Eloquent\\Model->asDateTime('2019-06-25 16:1...')
#2 \\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Eloquent\\Concerns\\HasAttributes.php(532): Illuminate\\Database\\Eloquent\\Model->fromDateTime('2019-06-25 16:1...')
#3 \\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Eloquent\\Model.php(230): Illuminate\\Database\\Eloquent\\Model->setAttribute('created_at', '2019-06-25 16:1...')
#4 \\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Eloquent\\Model.php(248): Illuminate\\Database\\Eloquent\\Model->fill(Array)
...

构建器以正确的格式检索时间戳(例如“2019-06-25 16:17:01+02”),但是当它尝试对相关模型数据透视数据进行水合时,它使用了错误的格式“Ymd H: i:s" 失败了。

有没有合适的方法来实现这一点?或者有什么可用的解决方法吗?

任何帮助表示赞赏?提前致谢!

【问题讨论】:

    标签: laravel eloquent timestamp pivot php-carbon


    【解决方案1】:

    您是否尝试过为数据透视表创建中间模型?然后您应该能够更改dateFormat 属性。

    例如,您可以像这样创建一个枢轴模型:

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Relations\Pivot;
    
    class RoleUser extends Pivot
    {
    
    }
    

    并更新其他模型上的关系以使用该 Pivot 模型。

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Role extends Model
    {
        /**
         * The users that belong to the role.
         */
        public function users()
        {
            return $this->belongsToMany('App\User')->using('App\RoleUser');
        }
    }
    

    那么因为你有一个 Pivot 模型的类,你应该能够指定格式。

    https://laravel.com/docs/5.8/eloquent-relationships#defining-custom-intermediate-table-models

    【讨论】:

    • 感谢您的回答。尽管我没有为我的所有关系创建数据透视模型,因为目前该项目有 60 多个表。相反,我在我的基本模型上覆盖了belongsToMany 方法,因此它使用了一个通用的枢轴模型。所以看起来问题已经解决了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2017-10-13
    • 2022-09-28
    • 1970-01-01
    相关资源
    最近更新 更多