2015-06-19 4 views
4

Так у меня есть App\Post модели в моем приложении, определяются следующим образом:Laravel Model Factoryories и Eloquent; установка дата

namespace App; 
class Post extends Model 
{ 

    use SoftDeletes; 

    protected $dates = ['created_at', 'updated_at', 'published_at', 'deleted_at']; 
    // etc... 
} 

Я создал модель завод, хорошую новую особенность Laravel 5.1 для определения светокопии в Post следующим образом:

$factory->define('App\Post', function($faker) { 
    return [ 
    'title'  => $faker->sentence, 
    'content' => $faker->paragraph, 
    'published_at' => $faker->dateTimeThisMonth(), 
    ]; 
}); 

Как мы можем видеть, что я установить published_at поле, чтобы быть случайной датой в этом месяце, генерируемый экземпляром Faker. Используемый метод возвращает экземпляр DateTime.

Однако, когда я генерирую Post s, я нахожу, что поле published_at является нулевым, что указывает на то, что экземпляр DateTime был неправильным образом интерпретирован.

Я обнаружил, что если бы я изменил эту строку:

'published_at' => Carbon::instance($faker->dateTimeThisMonth())->toDateTimeString(), 

, который по существу преобразует DateTime к Carbon, а затем выводит даты и времени, например, строку "2015-06-15 13:44:23", он работает правильно.

Действительно ли это лучший способ определить даты фальсификаций на фабриках моделей? Я бы подумал, что я определил published_at в массиве $dates. Laravel интерпретировал бы экземпляр DateTime (или Carbon) и сохранил его без необходимости предоставления строки.

Редактировать

Я нахожу, что это тоже не работает для простых красноречивый создает:

Э.Г. если я бегу

App\Post::create([ 
    'title' => $title, 
    'content' => $faker->paragraph(4),  
    'published_at' => new Carbon, 
    'created_at' => Carbon::parse('2015-06-16') 
]); 

published_at и created_at поле по-прежнему нулевой. Есть идеи?

+0

Я видел пару видео Laracasts, и Джеффри всегда использует Carbon внутри фабрик. Итак, я бы сказал, что это лучший способ. – zeratulmdq

ответ

2

Поскольку Faker возвращает DateTime-Object, который не представляет строку даты, такую ​​как mysql, ей нравится (Y-m-d H:i:s), поле будет установлено равным null.

Однако вы должны быть в состоянии получить доступ к свойству объектов date, чтобы получить правильную строку, как это:

$faker->dateTimeThisMonth()->format('Y-m-d H:i:s') 

Это должно возвращать дату, как этот string '2015-06-19 13:07:07' (length=19)

+0

Да, по сути, это то, что я делаю, но я просто использую метод Carbon для генерации строки.По сути, я хочу, чтобы можно было установить экземпляр DateTime или Carbon в качестве даты и красноречиво сохранить его в базе данных. Это описано [в документах] (http://laravel.com/docs/5.1/eloquent-mutators#date-mutators), но я не получаю такого поведения. – harryg

0

Вы можете использовать Carbon даты внутри модели заводов без проблем.

Чтобы сделать работу, пожалуйста, добавьте published_at и created_at в категорию $fillable.

Тогда он должен работать нормально.

Смежные вопросы