3

データベースにいくつかの日時フィールドを作成しました。Laravel のドキュメントで説明されているように、「どのフィールドが自動的に変更されるかをカスタマイズ」できます。ただし、それがどのように行われるかを示す例はなく、検索結果もありません。特定のフィールドを自動変更するにはどうすればよいですか?

たとえば、移行で「people」というテーブルを作成しました。フィールドの 1 つは次のように定義されています。

class CreatePeopleTable extends Migration {
  public function up(){
    Schema::create("bookings",function($table){
      ...
      $table->dateTime("birthday");
      ...
    }
  }
}

そして、モデルで「人」のモデルを定義しました。

class People extends Eloquent{
  //nothing here
}

People インスタンスの誕生日を参照すると、DateTime ではなく文字列になります。

$one=People::find(1);
var_dump($one->birthday);
//String

日付ミューテーターはそれを Carbon オブジェクトに直接変換できるはずですが、ドキュメントには実装方法についてあまり書かれていません。

4

4 に答える 4

17

People モデルに次の配列を追加するだけです。

protected $dates = array('birthday');

Laravel の Model.php 内部では、次のようにフィールドがデフォルトのフィールドとマージされます。

/**
     * Get the attributes that should be converted to dates.
     *
     * @return array
     */
    public function getDates()
    {
        $defaults = array(static::CREATED_AT, static::UPDATED_AT, static::DELETED_AT);

        return array_merge($this->dates, $defaults);
    }
于 2014-01-07T11:21:45.787 に答える
5

このdocによると、モデルメンバー関数getDates()を使用して、どのフィールドが自動的に変更されるかをカスタマイズできるため、次の例では String ではなく Carbon インスタンスが返されます。

$one = People::find(1);
var_dump($one->created_at);//created_at is a field mutated by default
//Carbon, which is a subclass of Datetime

ただし、独自のフィールドを追加する方法については明確に述べていません。getDates()メソッドが文字列の配列を返すことがわかりました。

$one = People::find(1);
echo $one->getDates();
//["created_at","modified_at"]

したがって、このメソッドの戻り値にフィールド名を追加することができます。

class People extends Eloquent{
    public function getDates(){
        $res=parent::getDates();
        array_push($res,"birthday");
        return $res;
    }
}

birthdayフィールドは、呼び出すたびに Carbon インスタンスとして返されます。

$one = People::find(1);
var_dump($one->birthday);
//Carbon
于 2013-09-06T10:10:59.767 に答える
3

どういう意味ですか: 自動的に変異しますか?

DB から取得した後に変更する場合は、Accessors と Mutators (Laravel docs) を使用します。

これをモデルに追加します。

public function getDateAttribute( $date )
{
     // modify $date as you want, example
     // $date = new \Carbon\Carbon($date);
     // $date->addDay()
     // return (string)$date
}
于 2013-08-23T12:19:45.260 に答える
1

Sasa Tokic が言うprotected $dates = array('birthday');ように、次のように People モデルに追加します。

class People extends Eloquent{
    protected $dates = array('birthday');
}

次に、Carbon を使用して、次のように、この値に対して巧妙なことを行うことができます。

$people->birthday->format('jS F Y')

PHP のdate()関数ドキュメント ( http://uk3.php.net/manual/en/function.date.php ) と Carbon のドキュメント ( https://github.com/briannesbitt/Carbon ) がここで役立ちます。

于 2014-03-02T16:42:01.733 に答える