BelongsToManyRelationship.php
TLDR
The BelongsToManyRelationship
class in the provided file is a part of the Illuminate\Database\Eloquent\Factories namespace. It defines a relationship that represents a belongs-to-many relationship between two models. The class has three properties: $factory
, $pivot
, and $relationship
. It also contains three methods: __construct
, createFor
, and recycle
.
Methods
__construct
The __construct
method is the constructor of the BelongsToManyRelationship
class. It initializes the $factory
, $pivot
, and $relationship
properties with the provided arguments.
createFor
The createFor
method is used to create the attached relationship for a given model. It takes a Model
instance as a parameter. It wraps the $factory
property in a Collection
if it is an instance of the Factory
class. It then iterates over the collection and attaches each attachable model to the relationship using the attach
method.
recycle
The recycle
method is used to specify the model instances to always use when creating relationships. It takes a Collection
of recyclable models as a parameter. If the $factory
property is an instance of the Factory
class, it calls the recycle
method on it, passing the recycle collection. It returns the current instance of the class.
<?php
namespace Illuminate\Database\Eloquent\Factories;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
class BelongsToManyRelationship
{
/**
* The related factory instance.
*
* @var \Illuminate\Database\Eloquent\Factories\Factory|\Illuminate\Support\Collection|\Illuminate\Database\Eloquent\Model|array
*/
protected $factory;
/**
* The pivot attributes / attribute resolver.
*
* @var callable|array
*/
protected $pivot;
/**
* The relationship name.
*
* @var string
*/
protected $relationship;
/**
* Create a new attached relationship definition.
*
* @param \Illuminate\Database\Eloquent\Factories\Factory|\Illuminate\Support\Collection|\Illuminate\Database\Eloquent\Model|array $factory
* @param callable|array $pivot
* @param string $relationship
* @return void
*/
public function __construct($factory, $pivot, $relationship)
{
$this->factory = $factory;
$this->pivot = $pivot;
$this->relationship = $relationship;
}
/**
* Create the attached relationship for the given model.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public function createFor(Model $model)
{
Collection::wrap($this->factory instanceof Factory ? $this->factory->create([], $model) : $this->factory)->each(function ($attachable) use ($model) {
$model->{$this->relationship}()->attach(
$attachable,
is_callable($this->pivot) ? call_user_func($this->pivot, $model) : $this->pivot
);
});
}
/**
* Specify the model instances to always use when creating relationships.
*
* @param \Illuminate\Support\Collection $recycle
* @return $this
*/
public function recycle($recycle)
{
if ($this->factory instanceof Factory) {
$this->factory = $this->factory->recycle($recycle);
}
return $this;
}
}