master

laravel/framework

Last updated at: 29/12/2023 09:22

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;
    }
}