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
HasOne.php
124 lines
| 1 | <?php |
| 2 | |
| 3 | namespace IAWPSCOPED\Illuminate\Database\Eloquent\Relations; |
| 4 | |
| 5 | use IAWPSCOPED\Illuminate\Contracts\Database\Eloquent\SupportsPartialRelations; |
| 6 | use IAWPSCOPED\Illuminate\Database\Eloquent\Builder; |
| 7 | use IAWPSCOPED\Illuminate\Database\Eloquent\Collection; |
| 8 | use IAWPSCOPED\Illuminate\Database\Eloquent\Model; |
| 9 | use IAWPSCOPED\Illuminate\Database\Eloquent\Relations\Concerns\CanBeOneOfMany; |
| 10 | use IAWPSCOPED\Illuminate\Database\Eloquent\Relations\Concerns\ComparesRelatedModels; |
| 11 | use IAWPSCOPED\Illuminate\Database\Eloquent\Relations\Concerns\SupportsDefaultModels; |
| 12 | use IAWPSCOPED\Illuminate\Database\Query\JoinClause; |
| 13 | /** @internal */ |
| 14 | class HasOne extends HasOneOrMany implements SupportsPartialRelations |
| 15 | { |
| 16 | use ComparesRelatedModels, CanBeOneOfMany, SupportsDefaultModels; |
| 17 | /** |
| 18 | * Get the results of the relationship. |
| 19 | * |
| 20 | * @return mixed |
| 21 | */ |
| 22 | public function getResults() |
| 23 | { |
| 24 | if (\is_null($this->getParentKey())) { |
| 25 | return $this->getDefaultFor($this->parent); |
| 26 | } |
| 27 | return $this->query->first() ?: $this->getDefaultFor($this->parent); |
| 28 | } |
| 29 | /** |
| 30 | * Initialize the relation on a set of models. |
| 31 | * |
| 32 | * @param array $models |
| 33 | * @param string $relation |
| 34 | * @return array |
| 35 | */ |
| 36 | public function initRelation(array $models, $relation) |
| 37 | { |
| 38 | foreach ($models as $model) { |
| 39 | $model->setRelation($relation, $this->getDefaultFor($model)); |
| 40 | } |
| 41 | return $models; |
| 42 | } |
| 43 | /** |
| 44 | * Match the eagerly loaded results to their parents. |
| 45 | * |
| 46 | * @param array $models |
| 47 | * @param \Illuminate\Database\Eloquent\Collection $results |
| 48 | * @param string $relation |
| 49 | * @return array |
| 50 | */ |
| 51 | public function match(array $models, Collection $results, $relation) |
| 52 | { |
| 53 | return $this->matchOne($models, $results, $relation); |
| 54 | } |
| 55 | /** |
| 56 | * Add the constraints for an internal relationship existence query. |
| 57 | * |
| 58 | * Essentially, these queries compare on column names like "whereColumn". |
| 59 | * |
| 60 | * @param \Illuminate\Database\Eloquent\Builder $query |
| 61 | * @param \Illuminate\Database\Eloquent\Builder $parentQuery |
| 62 | * @param array|mixed $columns |
| 63 | * @return \Illuminate\Database\Eloquent\Builder |
| 64 | */ |
| 65 | public function getRelationExistenceQuery(Builder $query, Builder $parentQuery, $columns = ['*']) |
| 66 | { |
| 67 | if ($this->isOneOfMany()) { |
| 68 | $this->mergeOneOfManyJoinsTo($query); |
| 69 | } |
| 70 | return parent::getRelationExistenceQuery($query, $parentQuery, $columns); |
| 71 | } |
| 72 | /** |
| 73 | * Add constraints for inner join subselect for one of many relationships. |
| 74 | * |
| 75 | * @param \Illuminate\Database\Eloquent\Builder $query |
| 76 | * @param string|null $column |
| 77 | * @param string|null $aggregate |
| 78 | * @return void |
| 79 | */ |
| 80 | public function addOneOfManySubQueryConstraints(Builder $query, $column = null, $aggregate = null) |
| 81 | { |
| 82 | $query->addSelect($this->foreignKey); |
| 83 | } |
| 84 | /** |
| 85 | * Get the columns that should be selected by the one of many subquery. |
| 86 | * |
| 87 | * @return array|string |
| 88 | */ |
| 89 | public function getOneOfManySubQuerySelectColumns() |
| 90 | { |
| 91 | return $this->foreignKey; |
| 92 | } |
| 93 | /** |
| 94 | * Add join query constraints for one of many relationships. |
| 95 | * |
| 96 | * @param \Illuminate\Database\Query\JoinClause $join |
| 97 | * @return void |
| 98 | */ |
| 99 | public function addOneOfManyJoinSubQueryConstraints(JoinClause $join) |
| 100 | { |
| 101 | $join->on($this->qualifySubSelectColumn($this->foreignKey), '=', $this->qualifyRelatedColumn($this->foreignKey)); |
| 102 | } |
| 103 | /** |
| 104 | * Make a new related instance for the given model. |
| 105 | * |
| 106 | * @param \Illuminate\Database\Eloquent\Model $parent |
| 107 | * @return \Illuminate\Database\Eloquent\Model |
| 108 | */ |
| 109 | public function newRelatedInstanceFor(Model $parent) |
| 110 | { |
| 111 | return $this->related->newInstance()->setAttribute($this->getForeignKeyName(), $parent->{$this->localKey}); |
| 112 | } |
| 113 | /** |
| 114 | * Get the value of the model's foreign key. |
| 115 | * |
| 116 | * @param \Illuminate\Database\Eloquent\Model $model |
| 117 | * @return mixed |
| 118 | */ |
| 119 | protected function getRelatedKeyFrom(Model $model) |
| 120 | { |
| 121 | return $model->getAttribute($this->getForeignKeyName()); |
| 122 | } |
| 123 | } |
| 124 |