1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
<?php
namespace Illuminate\Database\Eloquent\Relations;
use Closure; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Collection;
class HasOne extends HasOneOrMany { /** * Indicates if a default model instance should be used. * * Alternatively, may be a Closure to execute to retrieve default value. * * @var \Closure|bool */ protected $withDefault;
/** * Return a new model instance in case the relationship does not exist. * * @param \Closure|bool $callback * @return $this */ public function withDefault($callback = true) { $this->withDefault = $callback;
return $this; }
/** * Get the results of the relationship. * * @return mixed */ public function getResults() { return $this->query->first() ?: $this->getDefaultFor($this->parent); }
/** * Initialize the relation on a set of models. * * @param array $models * @param string $relation * @return array */ public function initRelation(array $models, $relation) { foreach ($models as $model) { $model->setRelation($relation, $this->getDefaultFor($model)); }
return $models; }
/** * Match the eagerly loaded results to their parents. * * @param array $models * @param \Illuminate\Database\Eloquent\Collection $results * @param string $relation * @return array */ public function match(array $models, Collection $results, $relation) { return $this->matchOne($models, $results, $relation); }
/** * Get the default value for this relation. * * @param \Illuminate\Database\Eloquent\Model $model * @return \Illuminate\Database\Eloquent\Model|null */ protected function getDefaultFor(Model $model) { if (is_callable($this->withDefault)) { return call_user_func($this->withDefault); } elseif ($this->withDefault === true) { return $this->related->newInstance()->setAttribute( $this->getPlainForeignKey(), $model->getAttribute($this->localKey) ); } } }
|