%PDF- %PDF-
Direktori : /var/www/html/coding/vendor/laravel/framework/src/Illuminate/Database/Eloquent/ |
Current File : /var/www/html/coding/vendor/laravel/framework/src/Illuminate/Database/Eloquent/FactoryBuilder.php |
<?php namespace Illuminate\Database\Eloquent; use Faker\Generator as Faker; use InvalidArgumentException; use Illuminate\Support\Traits\Macroable; class FactoryBuilder { use Macroable; /** * 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 model states. * * @var array */ protected $states; /** * The states to apply. * * @var array */ protected $activeStates = []; /** * The Faker instance for the builder. * * @var \Faker\Generator */ protected $faker; /** * The number of models to build. * * @var int|null */ protected $amount = null; /** * Create an new builder instance. * * @param string $class * @param string $name * @param array $definitions * @param array $states * @param \Faker\Generator $faker * @return void */ public function __construct($class, $name, array $definitions, array $states, Faker $faker) { $this->name = $name; $this->class = $class; $this->faker = $faker; $this->states = $states; $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; } /** * Set the states to be applied to the model. * * @param array|mixed $states * @return $this */ public function states($states) { $this->activeStates = is_array($states) ? $states : func_get_args(); return $this; } /** * Create a model and persist it in the database if requested. * * @param array $attributes * @return \Closure */ public function lazy(array $attributes = []) { return function () use ($attributes) { return $this->create($attributes); }; } /** * 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 ($results instanceof Model) { $this->store(collect([$results])); } else { $this->store($results); } return $results; } /** * Set the connection name on the results and store them. * * @param \Illuminate\Support\Collection $results * @return void */ protected function store($results) { $results->each(function ($model) { $model->setConnection($model->newQueryWithoutScopes()->getConnection()->getName()); $model->save(); }); } /** * Create a collection of models. * * @param array $attributes * @return mixed */ public function make(array $attributes = []) { if ($this->amount === null) { return $this->makeInstance($attributes); } if ($this->amount < 1) { return (new $this->class)->newCollection(); } return (new $this->class)->newCollection(array_map(function () use ($attributes) { return $this->makeInstance($attributes); }, range(1, $this->amount))); } /** * Create an array of raw attribute arrays. * * @param array $attributes * @return mixed */ public function raw(array $attributes = []) { if ($this->amount === null) { return $this->getRawAttributes($attributes); } if ($this->amount < 1) { return []; } return array_map(function () use ($attributes) { return $this->getRawAttributes($attributes); }, range(1, $this->amount)); } /** * Get a raw attributes array for the model. * * @param array $attributes * @return mixed */ protected function getRawAttributes(array $attributes = []) { $definition = call_user_func( $this->definitions[$this->class][$this->name], $this->faker, $attributes ); return $this->expandAttributes( array_merge($this->applyStates($definition, $attributes), $attributes) ); } /** * Make an instance of the model with the given attributes. * * @param array $attributes * @return \Illuminate\Database\Eloquent\Model * * @throws \InvalidArgumentException */ 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}]."); } return new $this->class( $this->getRawAttributes($attributes) ); }); } /** * Apply the active states to the model definition array. * * @param array $definition * @param array $attributes * @return array */ protected function applyStates(array $definition, array $attributes = []) { foreach ($this->activeStates as $state) { if (! isset($this->states[$this->class][$state])) { throw new InvalidArgumentException("Unable to locate [{$state}] state for [{$this->class}]."); } $definition = array_merge($definition, call_user_func( $this->states[$this->class][$state], $this->faker, $attributes )); } return $definition; } /** * Expand all attributes to their underlying values. * * @param array $attributes * @return array */ protected function expandAttributes(array $attributes) { foreach ($attributes as &$attribute) { if (is_callable($attribute) && ! is_string($attribute)) { $attribute = $attribute($attributes); } if ($attribute instanceof static) { $attribute = $attribute->create()->getKey(); } if ($attribute instanceof Model) { $attribute = $attribute->getKey(); } } return $attributes; } }