3

すべての日時データ (created_at、updated_at、およびカスタムの日時列: 予定_at) を UTC 形式で保存しています。

これらの日付をすべて取得し、ユーザーのタイムゾーンに変換して表示したいと思います。

ユーザーのタイムゾーンで日時を取得すると考えて、これらの関数をモデルに追加しました。

public function getCreatedAtAttribute($value)
{
    return $created_at->timezone(Auth::user()->timezone);
}

public function getUpdatedAtAttribute($value)
{
    return $updated_at->timezone(Auth::user()->timezone);
}

public function getAppointmentAtAttribute($value)
{
    return $appointment_at->timezone(Auth::user()->timezone);
}

しかし、次のエラーが表示されます。

Call to a member function timezone() on a non-object

私の構文にエラーがあると思います。何か不足していますか?ありがとう

更新 #1 ノート モデルを修正し、以下の完全なモデルを追加しました (@bernie による修正を含む)

<?php namespace App;


use Illuminate\Database\Eloquent\Model;


class Note extends Model {


/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'notes';


/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = ['client_id', 'business_id', 'note'];


/**
 * Note belonging to client.
 * 
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function client()
{
    return $this->belongsTo('App\Client');
}


public function getCreatedAtAttribute($value)
{
    return $this->created_at->timezone(Auth::user()->timezone);     
}   

public function getUpdatedAtAttribute($value)
{
    return $this->updated_at->timezone(Auth::user()->timezone);     
}   

public function getAppointmentAtAttribute($value)
{
    return $this->appointment_at->timezone(Auth::user()->timezone);     
}   

データベース モデルの定義

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateNotesTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('notes', function(Blueprint $table)
        {
            $table->increments('id');

            $table->integer('client_id')->unsigned();
            $table->foreign('client_id')->references('id')->on('clients')->onDelete('cascade');

            $table->integer('business_id')->unsigned();
            $table->foreign('business_id')->references('id')->on('businesses')->onDelete('cascade');

            $table->text('note');
            $table->dateTime('appointment_at');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('notes');
    }

}

エラーに関する詳細情報 (bernie による更新後)

 ErrorException in Note.php line 40: Undefined property: App\Note::$created_at

in Note.php line 40
at HandleExceptions->handleError('8', 'Undefined property: App\Note::$created_at', '/var/www/html/laravel5/app/Note.php', '40', array()) in Note.php line 40
at Note->getCreatedAtAttribute('2015-09-22 12:50:20') in Model.php line 2669
at Model->mutateAttribute('created_at', '2015-09-22 12:50:20') in Model.php line 2592
at Model->getAttributeValue('created_at') in Model.php line 2557
at Model->getAttribute('created_at') in Model.php line 3263
at Model->__get('created_at') in NotesController.php line 54
at NotesController->show('1')

解決

public function getCreatedAtAttribute($value)
{
    $date = $this->asDateTime($value);
    return $date->timezone(\Auth::user()->timezone);
}

また

public function getCreatedAtAttribute($value)
{
    $format = $this->getDateFormat();      
    return  Carbon::createFromFormat($format, $value, 'UTC')->setTimezone( \Auth::user()->timezone);
}   

これらのソリューションは両方ともうまくいきました。

4

1 に答える 1

6

ああ、なるほど!Accessors と Mutatorsを使用していることに気付きました。また、created_at およびその他のフィールドに使用される組み込みの日付ミューテーターをオーバーライドしています。dates

したがって、代わりにこれを試してください:

public function getCreatedAtAttribute($value)
{
    // asDateTime() is the built-in date mutator.
    $date = $this->asDateTime($value);
    return $date->timezone(Auth::user()->timezone);
}

public function getUpdatedAtAttribute($value)
{
    $date = $this->asDateTime($value);
    return $date->timezone(Auth::user()->timezone);
}

public function getAppointmentAtAttribute($value)
{
    $date = $this->asDateTime($value);
    return $date->timezone(Auth::user()->timezone);
}
于 2015-09-22T15:20:09.887 に答える