Concerns
1 month ago
BelongsTo.php
2 years ago
BelongsToMany.php
1 month ago
HasMany.php
2 years ago
HasManyThrough.php
1 month ago
HasOne.php
1 month ago
HasOneOrMany.php
1 month ago
HasOneThrough.php
2 years ago
MorphMany.php
2 years ago
MorphOne.php
1 month ago
MorphOneOrMany.php
2 years ago
MorphPivot.php
1 month ago
MorphTo.php
6 months ago
MorphToMany.php
2 years ago
Pivot.php
2 years ago
Relation.php
1 month ago
HasOneThrough.php
69 lines
| 1 | <?php |
| 2 | |
| 3 | namespace IAWPSCOPED\Illuminate\Database\Eloquent\Relations; |
| 4 | |
| 5 | use IAWPSCOPED\Illuminate\Database\Eloquent\Collection; |
| 6 | use IAWPSCOPED\Illuminate\Database\Eloquent\Model; |
| 7 | use IAWPSCOPED\Illuminate\Database\Eloquent\Relations\Concerns\InteractsWithDictionary; |
| 8 | use IAWPSCOPED\Illuminate\Database\Eloquent\Relations\Concerns\SupportsDefaultModels; |
| 9 | /** @internal */ |
| 10 | class HasOneThrough extends HasManyThrough |
| 11 | { |
| 12 | use InteractsWithDictionary, SupportsDefaultModels; |
| 13 | /** |
| 14 | * Get the results of the relationship. |
| 15 | * |
| 16 | * @return mixed |
| 17 | */ |
| 18 | public function getResults() |
| 19 | { |
| 20 | return $this->first() ?: $this->getDefaultFor($this->farParent); |
| 21 | } |
| 22 | /** |
| 23 | * Initialize the relation on a set of models. |
| 24 | * |
| 25 | * @param array $models |
| 26 | * @param string $relation |
| 27 | * @return array |
| 28 | */ |
| 29 | public function initRelation(array $models, $relation) |
| 30 | { |
| 31 | foreach ($models as $model) { |
| 32 | $model->setRelation($relation, $this->getDefaultFor($model)); |
| 33 | } |
| 34 | return $models; |
| 35 | } |
| 36 | /** |
| 37 | * Match the eagerly loaded results to their parents. |
| 38 | * |
| 39 | * @param array $models |
| 40 | * @param \Illuminate\Database\Eloquent\Collection $results |
| 41 | * @param string $relation |
| 42 | * @return array |
| 43 | */ |
| 44 | public function match(array $models, Collection $results, $relation) |
| 45 | { |
| 46 | $dictionary = $this->buildDictionary($results); |
| 47 | // Once we have the dictionary we can simply spin through the parent models to |
| 48 | // link them up with their children using the keyed dictionary to make the |
| 49 | // matching very convenient and easy work. Then we'll just return them. |
| 50 | foreach ($models as $model) { |
| 51 | if (isset($dictionary[$key = $this->getDictionaryKey($model->getAttribute($this->localKey))])) { |
| 52 | $value = $dictionary[$key]; |
| 53 | $model->setRelation($relation, \reset($value)); |
| 54 | } |
| 55 | } |
| 56 | return $models; |
| 57 | } |
| 58 | /** |
| 59 | * Make a new related instance for the given model. |
| 60 | * |
| 61 | * @param \Illuminate\Database\Eloquent\Model $parent |
| 62 | * @return \Illuminate\Database\Eloquent\Model |
| 63 | */ |
| 64 | public function newRelatedInstanceFor(Model $parent) |
| 65 | { |
| 66 | return $this->related->newInstance(); |
| 67 | } |
| 68 | } |
| 69 |