name = $name; $this->class = $class; $this->faker = $faker; $this->definitions = $definitions; } /** * Set the amount of models you wish to create / make. * * @param int $amount * @return $this */ public function times($amount) { $this->amount = $amount; return $this; } /** * Create a collection of models and persist them to the database. * * @param array $attributes * @return mixed */ public function create(array $attributes = []) { $results = $this->make($attributes); if ($this->amount === 1) { $results->save(); } else { foreach ($results as $result) { $result->save(); } } return $results; } /** * Create a collection of models. * * @param array $attributes * @return mixed */ public function make(array $attributes = []) { if ($this->amount === 1) { return $this->makeInstance($attributes); } else { $results = []; for ($i = 0; $i < $this->amount; $i++) { $results[] = $this->makeInstance($attributes); } return new Collection($results); } } /** * Make an instance of the model with the given attributes. * * @param array $attributes * @return \Illuminate\Database\Eloquent\Model */ protected function makeInstance(array $attributes = []) { return Model::unguarded(function () use ($attributes) { if (! isset($this->definitions[$this->class][$this->name])) { throw new InvalidArgumentException("Unable to locate factory with name [{$this->name}] [{$this->class}]."); } $definition = call_user_func($this->definitions[$this->class][$this->name], $this->faker, $attributes); return new $this->class(array_merge($definition, $attributes)); }); } }