Файл: vendor/laravel/framework/src/Illuminate/Database/Eloquent/PendingHasThroughRelationship.php
Строк: 200
<?php
namespace IlluminateDatabaseEloquent;
use BadMethodCallException;
use IlluminateDatabaseEloquentRelationsHasMany;
use IlluminateDatabaseEloquentRelationsMorphOneOrMany;
use IlluminateSupportStr;
use IlluminateSupportStringable;
/**
* @template TIntermediateModel of IlluminateDatabaseEloquentModel
* @template TDeclaringModel of IlluminateDatabaseEloquentModel
* @template TLocalRelationship of IlluminateDatabaseEloquentRelationsHasOneOrMany<TIntermediateModel, TDeclaringModel>
*/
class PendingHasThroughRelationship
{
/**
* The root model that the relationship exists on.
*
* @var TDeclaringModel
*/
protected $rootModel;
/**
* The local relationship.
*
* @var TLocalRelationship
*/
protected $localRelationship;
/**
* Create a pending has-many-through or has-one-through relationship.
*
* @param TDeclaringModel $rootModel
* @param TLocalRelationship $localRelationship
*/
public function __construct($rootModel, $localRelationship)
{
$this->rootModel = $rootModel;
$this->localRelationship = $localRelationship;
}
/**
* Define the distant relationship that this model has.
*
* @template TRelatedModel of IlluminateDatabaseEloquentModel
*
* @param string|(callable(TIntermediateModel): (IlluminateDatabaseEloquentRelationsHasOne<TRelatedModel, TIntermediateModel>|IlluminateDatabaseEloquentRelationsHasMany<TRelatedModel, TIntermediateModel>|IlluminateDatabaseEloquentRelationsMorphOneOrMany<TRelatedModel, TIntermediateModel>)) $callback
* @return (
* $callback is string
* ? IlluminateDatabaseEloquentRelationsHasManyThrough<IlluminateDatabaseEloquentModel, TIntermediateModel, TDeclaringModel>|IlluminateDatabaseEloquentRelationsHasOneThrough<IlluminateDatabaseEloquentModel, TIntermediateModel, TDeclaringModel>
* : (
* TLocalRelationship is IlluminateDatabaseEloquentRelationsHasMany<TIntermediateModel, TDeclaringModel>
* ? IlluminateDatabaseEloquentRelationsHasManyThrough<TRelatedModel, TIntermediateModel, TDeclaringModel>
* : (
* $callback is callable(TIntermediateModel): IlluminateDatabaseEloquentRelationsHasMany<TRelatedModel, TIntermediateModel>
* ? IlluminateDatabaseEloquentRelationsHasManyThrough<TRelatedModel, TIntermediateModel, TDeclaringModel>
* : IlluminateDatabaseEloquentRelationsHasOneThrough<TRelatedModel, TIntermediateModel, TDeclaringModel>
* )
* )
* )
*/
public function has($callback)
{
if (is_string($callback)) {
$callback = fn () => $this->localRelationship->getRelated()->{$callback}();
}
$distantRelation = $callback($this->localRelationship->getRelated());
if ($distantRelation instanceof HasMany || $this->localRelationship instanceof HasMany) {
$returnedRelation = $this->rootModel->hasManyThrough(
$distantRelation->getRelated()::class,
$this->localRelationship->getRelated()::class,
$this->localRelationship->getForeignKeyName(),
$distantRelation->getForeignKeyName(),
$this->localRelationship->getLocalKeyName(),
$distantRelation->getLocalKeyName(),
);
} else {
$returnedRelation = $this->rootModel->hasOneThrough(
$distantRelation->getRelated()::class,
$this->localRelationship->getRelated()::class,
$this->localRelationship->getForeignKeyName(),
$distantRelation->getForeignKeyName(),
$this->localRelationship->getLocalKeyName(),
$distantRelation->getLocalKeyName(),
);
}
if ($this->localRelationship instanceof MorphOneOrMany) {
$returnedRelation->where($this->localRelationship->getQualifiedMorphType(), $this->localRelationship->getMorphClass());
}
return $returnedRelation;
}
/**
* Handle dynamic method calls into the model.
*
* @param string $method
* @param array $parameters
* @return mixed
*
* @throws BadMethodCallException
*/
public function __call($method, $parameters)
{
if (Str::startsWith($method, 'has')) {
return $this->has((new Stringable($method))->after('has')->lcfirst()->toString());
}
throw new BadMethodCallException(sprintf(
'Call to undefined method %s::%s()', static::class, $method
));
}
}