In Laravel 5.3.17, Model Factories now includes states


October 6th, 2016

New in Laravel 5.3.17 is an improvement to Model Factories that you allows to define different “states” for a factory.

For example pretend you have a simple faker for creating a User:

$factory->define(App\User::class, function (Faker\Generator $faker) {
  return [
    'name' => $faker->name,
    'email' => $faker->safeEmail,

Now you want to have the ability to define an administrator:

$factory->state(\App\User::class, 'admin', function (\Faker\Generator $faker) {
  return [
    'is_admin' => 1,

Then a moderator flag:

$factory->state(\App\User::class, 'moderator', function (\Faker\Generator $faker) {
  return [
    'is_moderator' => 1,

With these three set you can now call them like this:

// Create 5 users
factory(\App\User::class, 5)->create();

// Create 5 Admins
factory(\App\User::class, 5)->states('admin')->create();

// Create 5 Moderators
factory(\App\User::class, 5)->states('moderator')->create();

// Create 5 Admins that are also moderators
factory(\App\User::class, 5)->states('admin', 'moderator')->create();


Also, included with this release is a change to the collection only method:

  • Collection::only() now returns all items if $keys is null (#15695)

Bug Fixes:

  • Added workaround for Memcached 3 on PHP7 when using many() (#15739)
  • Fixed bug in Validator::hydrateFiles() when removing the files array (#15663)
  • Fixed model factory bug when $amount is zero (#15764, #15779)
  • Prevent multiple notifications getting sent out when using the Notification facade (#15789)

The full Laravel changelog is available in the GitHub repo.

Filed in:

Eric L. Barnes

Eric is the creator of Laravel News and has been covering Laravel since 2012.