2017-07-28 14 views
1

状況:私は次のように宣言されているモデル(のはPivotそれを呼びましょう)があります:idnotification_iddevice_idcreated_at、:ピボットモデルにカスタムのcreated_at属性

class Pivot extends Model 
{ 
    public $timestamps = false; 
    ..... 
} 

をそれは5つのフィールドを持っていますread_at

このモデルは、NotificationDevice間にピボットテーブルとして使用される。

// 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', 
    ], 
+1

現在のlaravelプロジェクトだけでタイムゾーンを変更するとどうなりますか? mysql '>> [ 'ドライバ '=>' mysql '、....、' timezone '=>' +00:00 '] '! – Maraboc

+0

私はそれを試してみましょう! – gbalduzzi

+1

それは動作していますか? – Maraboc

答えて

0

使用model eventsあなたがモデルを作成している時にタイムスタンプを設定します。フィールドとタイムゾーンを一緒に設定できます。

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()または誰形質がモデル上で起動しないれます忘れないでください。