teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

Laravel5.5について

2018/01/11 05:03

投稿

masaya_ohashi
masaya_ohashi

スコア9210

answer CHANGED
@@ -1,3 +1,5 @@
1
+ ※この試行錯誤の過程でLaravelを5.5にアップデートしたため、以下のコードは5.4で動作しない可能性がありますのでご注意ください。
2
+
1
3
  アプリ内で使うモデルの共通基底クラスの`asDateTime`をオーバーライドすることで解決しました。
2
4
  ```PHP
3
5
  <?php

2

DB保存時にタイムゾーンの影響を受けてしまうため修正

2018/01/11 05:03

投稿

masaya_ohashi
masaya_ohashi

スコア9210

answer CHANGED
@@ -20,6 +20,13 @@
20
20
  }
21
21
  return $date;
22
22
  }
23
+ public function fromDateTime($value)
24
+ {
25
+ // DBに保存する際に時刻がタイムゾーンの影響を受けてしまうため、デフォルトのタイムゾーンに戻す処理を挟む
26
+ return empty($value) ? $value : $this->asDateTime($value)->timezone(config('app.timezone'))->format(
27
+ $this->getDateFormat()
28
+ );
29
+ }
23
30
  }
24
31
  ```
25
32
 

1

注記

2018/01/11 04:49

投稿

masaya_ohashi
masaya_ohashi

スコア9210

answer CHANGED
@@ -21,4 +21,10 @@
21
21
  return $date;
22
22
  }
23
23
  }
24
- ```
24
+ ```
25
+
26
+ ただし、以下のような`HasAttribute#asDateTime`を経由しない処理の場合、当然ながらtime_zoneが適用されません。
27
+ - `Model`のミューテタ(`getXXXXXAtribute`メソッド)が定義されていたとき
28
+ - `Model`の`$casts`対象だったとき
29
+ - `Model`の`$dates`対象でないとき
30
+ - `HasAttribute#getAttributeFromArray`や`getAttributes`や`getOriginal`を使って直接アクセスしたとき