Completed
Push — master ( 058435...d3162a )
by Patrick
02:34
created

Relations::manyToOne()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 8

Duplication

Lines 12
Ratio 100 %

Importance

Changes 3
Bugs 1 Features 0
Metric Value
c 3
b 1
f 0
dl 12
loc 12
rs 9.4286
cc 1
eloc 8
nc 1
nop 3
1
<?php
2
3
namespace LaravelDoctrine\Fluent\Builders\Traits;
4
5
use Illuminate\Support\Str;
6
use LaravelDoctrine\Fluent\Buildable;
7
use LaravelDoctrine\Fluent\Relations\ManyToMany;
8
use LaravelDoctrine\Fluent\Relations\ManyToOne;
9
use LaravelDoctrine\Fluent\Relations\OneToMany;
10
use LaravelDoctrine\Fluent\Relations\OneToOne;
11
use LaravelDoctrine\Fluent\Relations\Relation;
12
13
trait Relations
14
{
15
    /**
16
     * @param string        $entity
17
     * @param string|null   $field
18
     * @param callable|null $callback
19
     *
20
     * @return OneToOne
21
     */
22
    public function hasOne($entity, $field = null, callable $callback = null)
23
    {
24
        return $this->oneToOne($entity, $field, $callback);
25
    }
26
27
    /**
28
     * @param string        $entity
29
     * @param string|null   $field
30
     * @param callable|null $callback
31
     *
32
     * @return OneToOne
33
     */
34 View Code Duplication
    public function oneToOne($entity, $field = null, callable $callback = null)
35
    {
36
        return $this->addRelation(
37
            new OneToOne(
38
                $this->getBuilder(),
39
                $this->getNamingStrategy(),
40
                $this->guessSingularField($entity, $field),
41
                $entity
42
            ),
43
            $callback
44
        );
45
    }
46
47
    /**
48
     * @param string        $entity
49
     * @param string|null   $field
50
     * @param callable|null $callback
51
     *
52
     * @return ManyToOne
53
     */
54
    public function belongsTo($entity, $field = null, callable $callback = null)
55
    {
56
        return $this->manyToOne($entity, $field, $callback);
57
    }
58
59
    /**
60
     * @param string        $entity
61
     * @param string|null   $field
62
     * @param callable|null $callback
63
     *
64
     * @return ManyToOne
65
     */
66 View Code Duplication
    public function manyToOne($entity, $field = null, callable $callback = null)
67
    {
68
        return $this->addRelation(
69
            new ManyToOne(
70
                $this->getBuilder(),
71
                $this->getNamingStrategy(),
72
                $this->guessSingularField($entity, $field),
73
                $entity
74
            ),
75
            $callback
76
        );
77
    }
78
79
    /**
80
     * @param string        $entity
81
     * @param string|null   $field
82
     * @param callable|null $callback
83
     *
84
     * @return OneToMany
85
     */
86
    public function hasMany($entity, $field = null, callable $callback = null)
87
    {
88
        return $this->oneToMany($entity, $field, $callback);
89
    }
90
91
    /**
92
     * @param string        $entity
93
     * @param string|null   $field
94
     * @param callable|null $callback
95
     *
96
     * @return OneToMany
97
     */
98 View Code Duplication
    public function oneToMany($entity, $field = null, callable $callback = null)
99
    {
100
        return $this->addRelation(
101
            new OneToMany(
102
                $this->getBuilder(),
103
                $this->getNamingStrategy(),
104
                $this->guessPluralField($entity, $field),
105
                $entity
106
            ),
107
            $callback
108
        );
109
    }
110
111
    /**
112
     * @param string        $entity
113
     * @param string|null   $field
114
     * @param callable|null $callback
115
     *
116
     * @return ManyToMany
117
     */
118
    public function belongsToMany($entity, $field = null, callable $callback = null)
119
    {
120
        return $this->manyToMany($entity, $field, $callback);
121
    }
122
123
    /**
124
     * @param string        $entity
125
     * @param string|null   $field
126
     * @param callable|null $callback
127
     *
128
     * @return ManyToMany
129
     */
130 View Code Duplication
    public function manyToMany($entity, $field = null, callable $callback = null)
131
    {
132
        return $this->addRelation(
133
            new ManyToMany(
134
                $this->getBuilder(),
135
                $this->getNamingStrategy(),
136
                $this->guessPluralField($entity, $field),
137
                $entity
138
            ),
139
            $callback
140
        );
141
    }
142
143
    /**
144
     * Adds a custom relation to the entity.
145
     *
146
     * @param Relation      $relation
147
     * @param callable|null $callback
148
     *
149
     * @return Relation
150
     */
151
    public function addRelation(Relation $relation, callable $callback = null)
152
    {
153
        $this->callbackAndQueue($relation, $callback);
154
155
        return $relation;
156
    }
157
158
    /**
159
     * @param string      $entity
160
     * @param string|null $field
161
     *
162
     * @return string
163
     */
164
    protected function guessSingularField($entity, $field = null)
165
    {
166
        return $field ?: Str::camel(class_basename($entity));
167
    }
168
169
    /**
170
     * @param string      $entity
171
     * @param string|null $field
172
     *
173
     * @return string
174
     */
175
    protected function guessPluralField($entity, $field = null)
176
    {
177
        return $field ?: Str::plural($this->guessSingularField($entity));
178
    }
179
180
    /**
181
     * @return \Doctrine\ORM\Mapping\Builder\ClassMetadataBuilder
182
     */
183
    abstract public function getBuilder();
184
185
    /**
186
     * @param Buildable     $buildable
187
     * @param callable|null $callback
188
     */
189
    abstract protected function callbackAndQueue(Buildable $buildable, callable $callback = null);
190
191
    /**
192
     * @return \Doctrine\ORM\Mapping\NamingStrategy
193
     */
194
    abstract public function getNamingStrategy();
195
}
196