状況:私は次のように宣言されているモデル(のはPivot
それを呼びましょう)があります:id
、notification_id
、device_id
、created_at
、:ピボットモデルにカスタムのcreated_at属性
class Pivot extends Model
{
public $timestamps = false;
.....
}
をそれは5つのフィールドを持っていますread_at
。
このモデルは、Notification
とDevice
間にピボットテーブルとして使用される。
// 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);
}
iは、デバイスクラス内の同じました。
MySQLには、UTCとは異なるタイムゾーン(Europe\Rome
)があります。異なるプロジェクトですでに使用されているため、変更できません。
問題:created_at
フィールドを正しく設定するにはどうすればよいですか?
デフォルトのタイムスタンプを使用しようとしましたが、それでもupdated_at
列が追加されてしまいます(冗長性が余りにも多くなります)。
だから私はpublic $timestamps = false;
を設定し、私はそのようなデータベースのフィールドを作成:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
この1の問題は、先に言ったように、MySQLが間違ったタイムゾーン(Europe\Rome
を)持っている、ということですので、ときに私この表のデータを読み取ると、created_at
の値は元の値から2時間ずれます。これは、read_at
プロパティも設定すると問題になります。なぜなら、作成前に通知が読み取られる状況を作成するためです。
私が最後にした考えは、created_at
を作成イベント内に設定することでした。私はthis laracast guideを追跡しましたが、明らかに、データがsync
メソッドからピボットテーブルとして挿入された場合、イベントは呼び出されません(私にとってはうまくいかなかった)。
他にもアイデアはありますか?もちろん、作成されたPivot
を反復処理して手動で設定するなど、動作する可能性のある醜いハックがありますが、私はより良い解決策を使いたいと思います。
EDIT:@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',
],
現在のlaravelプロジェクトだけでタイムゾーンを変更するとどうなりますか? mysql '>> [ 'ドライバ '=>' mysql '、....、' timezone '=>' +00:00 '] '! – Maraboc
私はそれを試してみましょう! – gbalduzzi
それは動作していますか? – Maraboc