| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- <?php
- namespace Illuminate\Database\Eloquent;
- use BadMethodCallException;
- use Illuminate\Database\Eloquent\Relations\HasMany;
- use Illuminate\Support\Str;
- class PendingHasThroughRelationship
- {
- /**
- * The root model that the relationship exists on.
- *
- * @var \Illuminate\Database\Eloquent\Model
- */
- protected $rootModel;
- /**
- * The local relationship.
- *
- * @var \Illuminate\Database\Eloquent\Relations\HasMany|\Illuminate\Database\Eloquent\Relations\HasOne
- */
- protected $localRelationship;
- /**
- * Create a pending has-many-through or has-one-through relationship.
- *
- * @param \Illuminate\Database\Eloquent\Model $rootModel
- * @param \Illuminate\Database\Eloquent\Relations\HasMany|\Illuminate\Database\Eloquent\Relations\HasOne $localRelationship
- */
- public function __construct($rootModel, $localRelationship)
- {
- $this->rootModel = $rootModel;
- $this->localRelationship = $localRelationship;
- }
- /**
- * Define the distant relationship that this model has.
- *
- * @param string|(callable(\Illuminate\Database\Eloquent\Model): (\Illuminate\Database\Eloquent\Relations\HasOne|\Illuminate\Database\Eloquent\Relations\HasMany)) $callback
- * @return \Illuminate\Database\Eloquent\Relations\HasManyThrough|\Illuminate\Database\Eloquent\Relations\HasOneThrough
- */
- public function has($callback)
- {
- if (is_string($callback)) {
- $callback = fn () => $this->localRelationship->getRelated()->{$callback}();
- }
- $distantRelation = $callback($this->localRelationship->getRelated());
- if ($distantRelation instanceof HasMany) {
- return $this->rootModel->hasManyThrough(
- $distantRelation->getRelated()::class,
- $this->localRelationship->getRelated()::class,
- $this->localRelationship->getForeignKeyName(),
- $distantRelation->getForeignKeyName(),
- $this->localRelationship->getLocalKeyName(),
- $distantRelation->getLocalKeyName(),
- );
- }
- return $this->rootModel->hasOneThrough(
- $distantRelation->getRelated()::class,
- $this->localRelationship->getRelated()::class,
- $this->localRelationship->getForeignKeyName(),
- $distantRelation->getForeignKeyName(),
- $this->localRelationship->getLocalKeyName(),
- $distantRelation->getLocalKeyName(),
- );
- }
- /**
- * Handle dynamic method calls into the model.
- *
- * @param string $method
- * @param array $parameters
- * @return mixed
- */
- public function __call($method, $parameters)
- {
- if (Str::startsWith($method, 'has')) {
- return $this->has(Str::of($method)->after('has')->lcfirst()->toString());
- }
- throw new BadMethodCallException(sprintf(
- 'Call to undefined method %s::%s()', static::class, $method
- ));
- }
- }
|