如何更改 Laravel 中枢轴上时间戳的日期格式?
How to change date format of timestamps on pivot in Laravel?
我正在尝试在整个应用程序中全局更改时间戳的日期类型(created_at、updated_at、deleted_at)从 timestams
到 timestampsTz
.在迁移中没问题。在单个模型中,因为我可以覆盖模型的 $dateFormat
参数。
但我对包含时间戳的数据透视表 table 有疑问,因为它们不从我的模型继承任何参数。
假设我有一个 products 和 attributes table with attribute_product 在包含 value
和 timestamps
等列的它们之间进行旋转。如果我尝试检索具有产品值和时间戳的所有属性,我会做这样的事情:$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”)检索时间戳,但是当它尝试合并相关模型数据透视表时,它使用了错误的格式 "Y-m-d H:i:s" 失败了。
有什么合适的方法可以做到这一点吗?或者有什么可用的解决方法吗?
感谢任何帮助?提前致谢!
您是否尝试过为您的数据透视表创建一个中介模型?然后你应该能够改变 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');
}
}
那么因为你有一个 class 的 Pivot 模型,你应该能够指定格式。
https://laravel.com/docs/5.8/eloquent-relationships#defining-custom-intermediate-table-models
我正在尝试在整个应用程序中全局更改时间戳的日期类型(created_at、updated_at、deleted_at)从 timestams
到 timestampsTz
.在迁移中没问题。在单个模型中,因为我可以覆盖模型的 $dateFormat
参数。
但我对包含时间戳的数据透视表 table 有疑问,因为它们不从我的模型继承任何参数。
假设我有一个 products 和 attributes table with attribute_product 在包含 value
和 timestamps
等列的它们之间进行旋转。如果我尝试检索具有产品值和时间戳的所有属性,我会做这样的事情:$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”)检索时间戳,但是当它尝试合并相关模型数据透视表时,它使用了错误的格式 "Y-m-d H:i:s" 失败了。
有什么合适的方法可以做到这一点吗?或者有什么可用的解决方法吗?
感谢任何帮助?提前致谢!
您是否尝试过为您的数据透视表创建一个中介模型?然后你应该能够改变 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');
}
}
那么因为你有一个 class 的 Pivot 模型,你应该能够指定格式。
https://laravel.com/docs/5.8/eloquent-relationships#defining-custom-intermediate-table-models