Laravel 在枢轴模型上自定义创建的_at属性

Laravel 在枢轴模型上自定义创建的_at属性,laravel,pivot-table,laravel-5.4,php-carbon,Laravel,Pivot Table,Laravel 5.4,Php Carbon,情况:我有一个模型(我们称之为Pivot),声明如下: class Pivot extends Model { public $timestamps = false; ..... } 它有5个字段:id,通知id,设备id,在创建,在读取 此模型用作通知和设备之间的数据透视表: // Notification.php public function devices() { return $this->belongsToMany(Device::class)

情况:我有一个模型(我们称之为
Pivot
),声明如下:

class Pivot extends Model
{
    public $timestamps = false;
    .....
}
它有5个字段:
id
通知id
设备id
创建,
读取

此模型用作
通知
设备
之间的数据透视表:

// Notification.php
public function devices()
{
    return $this->belongsToMany(Device::class)
        ->withPivot(['id','created_at','notification_id','device_id', 'read_at']); 
}

public function pivots() {
    return $this->hasMany(Pivot::class);
}
我在设备类中也做了同样的事情

我的MySQL的时区(
Europe\Rome
)与UTC不同,我无法更改它,因为它已被不同的项目使用

问题:如何设置在创建的
字段以正常工作

我尝试使用默认时间戳,但它也会在
列中添加
updated\u,我无法使用它(这会增加太多冗余)

所以我设置了
public$timestamps=false我在数据库中创建了如下字段:

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
这个表的问题是,正如前面所说,MySQL的时区是错误的(
Europe\Rome
),因此当我从这个表中读取数据时,
created\u at
的值比原来的值偏移了2个小时。当我还将
read\u设置为
属性时,这是一个问题,因为它会创建在创建之前读取通知的情况

我的最后一个想法是在创建事件中设置
created\u。我遵循了这一点,但显然,如果数据作为透视表从
sync
方法插入,则不会调用事件(它们对我不起作用)

你还有其他想法吗?当然,也有一些丑陋的黑客可以工作(比如在创建的
Pivot
上迭代并手动设置),但我希望使用更好的解决方案

编辑:@Maraboc提出的解决方案非常有效。我在
config/database.php
中设置了MySQL配置数组的时区属性:

'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
        'timezone' => '+00:00',
    ],
用于在创建模型时设置时间戳。您可以同时设置字段和时区

class Pivot extends Model
{
    public $timestamps = false;

    protected static function boot()
    {
        static::creating(function($model) {
            $model->create_at = Carbon::now('Europe\Rome');
        });

        parent::boot();
    }
}
不要忘记父::boot()
,否则不会在模型上引导任何特征。

用于在创建模型时设置时间戳。您可以同时设置字段和时区

class Pivot extends Model
{
    public $timestamps = false;

    protected static function boot()
    {
        static::creating(function($model) {
            $model->create_at = Carbon::now('Europe\Rome');
        });

        parent::boot();
    }
}

不要忘记
parent::boot()
,否则不会在模型上启动任何特性。

在当前的laravel项目中更改时区怎么样?在
config/database.php
'mysql'=>['driver'=>'mysql',..,'timezone'=>'+00:00']
中!我要试试看!它有用吗?是的,有用。谢谢在当前的laravel项目中更改时区怎么样?在
config/database.php
'mysql'=>['driver'=>'mysql',..,'timezone'=>'+00:00']
中!我要试试看!它有用吗?是的,有用。谢谢