136 lines
3.0 KiB
PHP
136 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace Illuminate\Database\Eloquent;
|
|
|
|
use Faker\Generator as Faker;
|
|
use InvalidArgumentException;
|
|
|
|
class FactoryBuilder
|
|
{
|
|
/**
|
|
* The model definitions in the container.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $definitions;
|
|
|
|
/**
|
|
* The model being built.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $class;
|
|
|
|
/**
|
|
* The name of the model being built.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $name = 'default';
|
|
|
|
/**
|
|
* The number of models to build.
|
|
*
|
|
* @var int
|
|
*/
|
|
protected $amount = 1;
|
|
|
|
/**
|
|
* The Faker instance for the builder.
|
|
*
|
|
* @var \Faker\Generator
|
|
*/
|
|
protected $faker;
|
|
|
|
/**
|
|
* Create an new builder instance.
|
|
*
|
|
* @param string $class
|
|
* @param string $name
|
|
* @param array $definitions
|
|
* @param \Faker\Generator $faker
|
|
* @return void
|
|
*/
|
|
public function __construct($class, $name, array $definitions, Faker $faker)
|
|
{
|
|
$this->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}].");
|
|
}
|
|
|
|
$definition = call_user_func($this->definitions[$this->class][$this->name], $this->faker, $attributes);
|
|
|
|
return new $this->class(array_merge($definition, $attributes));
|
|
});
|
|
}
|
|
}
|