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']
中!我要试试看!它有用吗?是的,有用。谢谢