Вход Регистрация
Файл: 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
        
));
    }
}
Онлайн: 2
Реклама