2013-06-07 2 views
3

моего путешествия в Laravel 4 (из Laravel 3) продолжается ....Laravel проблема с Мутаторами

У меня есть модель статьи, доступ к таблице под названием статья.

Я создал модель со следующими мутаторов:

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)); 
} 

} 

Теперь, когда я запрос к базе данных со следующим и удалить мутаторов все работает, как ожидалось, и я получаю данные я ожидаю:

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 

порядок столбца изменяется, и он включен столбец я не сделал первоначально запрос. Как правильно реализовать мутаторы и почему меняются столбцы?

Я неправильно понял это?

Благодаря

Ray

+0

Это выглядит как ошибка внутри 'красноречивого \ model'. Почему вы не можете передавать коллекцию (а не массив) для просмотра? – radmen

+0

Привет. В конечном итоге я передаю данные в подключаемый файл datatables - и будет использовать объект. Тем не менее, происходит то же самое (добавление в атрибут valid_until. Передача массиву только для целей тестирования, поэтому я могу видеть результаты. Эти результаты отражают те объекты в объекте (порядок и порядок столбцов и т. Д.). Я не ожидал thy column re-ordering или дополнительный столбец - не произошло в L3 – Ray

ответ

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

+0

Когда у меня это в L3, я получил только столбцы/поля, которые были включены в выборку. Таким образом, с этой функцией на месте, каждый раз, когда я вызываю эту модель, я Я получу дополнительные столбцы, хочу ли я их или нет? Я думал, что он только изменил и вернул данные, если он существовал в запросе? – Ray

+0

Я думаю, что вы правы, а код не делает то, что он должен делать. вопрос о Гитубе, чтобы обсудить это, я думаю. – Aloys