3

(laravel 3から)laravel 4への旅は続きます....

私は Article モデルを持っており、articles というテーブルにアクセスしています。

次のミューテーターを使用してモデルをセットアップしました。

class Article extends Eloquent {

 public function getArticleDateAttribute($value)
{
    return date('d/m/Y', strtotime($value));
}

public function getValidUntilAttribute($value)
{
    return date('d/m/Y', strtotime($value));
}

}

次のAND Delete the mutatorsを使用してデータベースにクエリを実行すると、すべてが期待どおりに機能し、期待どおりのデータが得られます。

public function getTest() {

    $data = Article::select(array(
        'articles.id',
        'articles.article_date',
        'articles.image_link',
        'articles.headline',
        'articles.category'
    ))  ->get()
        ->toArray();
    var_dump($data);
    //return View::make('_layouts.master');
}

私のテストでは、次のサンプルのように期待どおりの結果が得られます。

array (size=5)
  'id' => int 3
  'article_date' => string '2008-06-03 00:00:00' (length=19)
  'image_link' => string '' (length=0)
  'headline' => string 'Sussex Amateur Course Closure' (length=29)
  'category' => int 6

ここで、ミューテーターを再度追加すると、正確なクエリで次のデータが得られます。

array (size=6)
  'article_date' => string '03/06/2008' (length=10)
  'valid_until' => string '01/01/1970' (length=10)
  'id' => int 3
  'image_link' => string '' (length=0)
  'headline' => string 'Sussex Amateur Course Closure' (length=29)
  'category' => int 6

列の順序が変更され、最初に要求しなかった列が含まれています。ミューテーターを正しく実装するにはどうすればよいですか? また、列が変更されるのはなぜですか?

私はこれを誤解しましたか?

ありがとう

レイ

4

1 に答える 1

0

コードはそのように構築されているため、ミューテーターが呼び出されます。Eloquent Model クラス ( によって呼び出されるtoArray())でのこの関数の実装を参照してください。

/**
 * Convert the model's attributes to an array.
 *
 * @return array
 */
public function attributesToArray()
{
    $attributes = $this->getAccessibleAttributes();

    // We want to spin through all the mutated attributes for this model and call
    // the mutator for the attribute. We cache off every mutated attributes so
    // we don't have to constantly check on attributes that actually change.
    foreach ($this->getMutatedAttributes() as $key)
    {
        if ( ! array_key_exists($key, $attributes)) continue;

        $attributes[$key] = $this->mutateAttribute($key, $attributes[$key]);
    }

    return $attributes;
}

https://github.com/laravel/framework/blob/master/src/Illuminate/Database/Eloquent/Model.php

于 2013-06-07T16:50:55.753 に答える