Skip to content

Commit 14db4cb

Browse files
committed
Adding more collection operations for #239
1 parent 415ed78 commit 14db4cb

File tree

5 files changed

+100
-35
lines changed

5 files changed

+100
-35
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<?php namespace Jenssegers\Mongodb\Eloquent;
2+
3+
use Illuminate\Database\Eloquent\Collection as BaseCollection;
4+
5+
class Collection extends BaseCollection {
6+
7+
/**
8+
* Simulate a basic where clause on the ollection.
9+
*
10+
* @param string $key
11+
* @param string $operator
12+
* @param mixed $value
13+
* @param string $boolean
14+
* @return $this
15+
*/
16+
public function where($key, $operator = null, $value = null)
17+
{
18+
// Here we will make some assumptions about the operator. If only 2 values are
19+
// passed to the method, we will assume that the operator is an equals sign
20+
// and keep going.
21+
if (func_num_args() == 2)
22+
{
23+
list($value, $operator) = array($operator, '=');
24+
}
25+
26+
return $this->filter(function($item) use ($key, $operator, $value)
27+
{
28+
$actual = $item->{$key};
29+
30+
switch ($operator)
31+
{
32+
case '<>':
33+
case '!=':
34+
return $actual != $value;
35+
break;
36+
37+
case '>':
38+
return $actual > $value;
39+
break;
40+
41+
case '<':
42+
return $actual < $value;
43+
break;
44+
45+
case '>=':
46+
return $actual >= $value;
47+
break;
48+
49+
case 'between':
50+
return $actual >= $value[0] and $actual <= $value[1];
51+
break;
52+
53+
case '=':
54+
default:
55+
return $actual == $value;
56+
break;
57+
}
58+
});
59+
}
60+
61+
/**
62+
* Simulate order by.
63+
*
64+
* @param string $key
65+
* @param string $direction
66+
* @return Illuminate\Database\Eloquent\Collection
67+
*/
68+
public function orderBy($key, $direction = 'asc')
69+
{
70+
$descending = strtolower($direction) == 'desc';
71+
72+
return $this->sortBy($key, SORT_REGULAR, $descending);
73+
}
74+
75+
}

src/Jenssegers/Mongodb/Relations/EmbedsMany.php

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
<?php namespace Jenssegers\Mongodb\Relations;
22

3+
use MongoId;
34
use Illuminate\Database\Eloquent\Model;
45
use Illuminate\Database\Eloquent\Builder;
56
use Illuminate\Database\Eloquent\Relations\Relation;
6-
use Illuminate\Database\Eloquent\Collection;
7-
use MongoId;
87

98
class EmbedsMany extends EmbedsOneOrMany {
109

1110
/**
1211
* Get the results of the relationship.
1312
*
14-
* @return Illuminate\Database\Eloquent\Collection
13+
* @return Jenssegers\Mongodb\Eloquent\Collection
1514
*/
1615
public function getResults()
1716
{
@@ -290,20 +289,6 @@ protected function setEmbedded($models)
290289
return parent::setEmbedded(array_values($models));
291290
}
292291

293-
/**
294-
* Simulate order by method.
295-
*
296-
* @param string $column
297-
* @param string $direction
298-
* @return Illuminate\Database\Eloquent\Collection
299-
*/
300-
public function orderBy($column, $direction = 'asc')
301-
{
302-
$descending = strtolower($direction) == 'desc';
303-
304-
return $this->getResults()->sortBy($column, SORT_REGULAR, $descending);
305-
}
306-
307292
/**
308293
* Handle dynamic method calls to the relationship.
309294
*
@@ -314,7 +299,7 @@ public function orderBy($column, $direction = 'asc')
314299
public function __call($method, $parameters)
315300
{
316301
// Collection methods
317-
if (method_exists('Illuminate\Database\Eloquent\Collection', $method))
302+
if (method_exists('Jenssegers\Mongodb\Eloquent\Collection', $method))
318303
{
319304
return call_user_func_array(array($this->getResults(), $method), $parameters);
320305
}

src/Jenssegers/Mongodb/Relations/EmbedsOne.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
<?php namespace Jenssegers\Mongodb\Relations;
22

3+
use MongoId;
34
use Illuminate\Database\Eloquent\Model;
45
use Illuminate\Database\Eloquent\Builder;
56
use Illuminate\Database\Eloquent\Relations\Relation;
6-
use Illuminate\Database\Eloquent\Collection;
7-
use MongoId;
87

98
class EmbedsOne extends EmbedsOneOrMany {
109

1110
/**
1211
* Get the results of the relationship.
1312
*
14-
* @return Illuminate\Database\Eloquent\Collection
13+
* @return \Illuminate\Database\Eloquent\Model
1514
*/
1615
public function getResults()
1716
{

src/Jenssegers/Mongodb/Relations/EmbedsOneOrMany.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
<?php namespace Jenssegers\Mongodb\Relations;
22

3+
use MongoId;
34
use Illuminate\Database\Eloquent\Model;
45
use Illuminate\Database\Eloquent\Builder;
56
use Illuminate\Database\Eloquent\Relations\Relation;
6-
use Illuminate\Database\Eloquent\Collection;
7-
use MongoId;
7+
use Illuminate\Database\Eloquent\Collection as BaseCollection;
8+
use Jenssegers\Mongodb\Eloquent\Collection;
89

910
abstract class EmbedsOneOrMany extends Relation {
1011

@@ -109,7 +110,7 @@ public function initRelation(array $models, $relation)
109110
* @param string $relation
110111
* @return array
111112
*/
112-
public function match(array $models, Collection $results, $relation)
113+
public function match(array $models, BaseCollection $results, $relation)
113114
{
114115
foreach ($models as $model)
115116
{
@@ -126,7 +127,7 @@ public function match(array $models, Collection $results, $relation)
126127
/**
127128
* Shorthand to get the results of the relationship.
128129
*
129-
* @return Illuminate\Database\Eloquent\Collection
130+
* @return Jenssegers\Mongodb\Eloquent\Collection
130131
*/
131132
public function get()
132133
{
@@ -278,7 +279,7 @@ protected function getForeignKeyValue($id)
278279
* Convert an array of records to a Collection.
279280
*
280281
* @param array $records
281-
* @return Illuminate\Database\Eloquent\Collection
282+
* @return Jenssegers\Mongodb\Eloquent\Collection
282283
*/
283284
protected function toCollection(array $records = array())
284285
{
@@ -294,7 +295,7 @@ protected function toCollection(array $records = array())
294295
$models = $this->eagerLoadRelations($models);
295296
}
296297

297-
return $this->related->newCollection($models);
298+
return new Collection($models);
298299
}
299300

300301
/**

tests/EmbeddedRelationsTest.php

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -416,14 +416,19 @@ public function testEmbedsManyDeleteAll()
416416
public function testEmbedsManyCollectionMethods()
417417
{
418418
$user = User::create(array('name' => 'John Doe'));
419-
$user->addresses()->save(new Address(array('city' => 'New York')));
420-
$user->addresses()->save(new Address(array('city' => 'Paris')));
421-
$user->addresses()->save(new Address(array('city' => 'Brussels')));
422-
423-
$this->assertEquals(array('New York', 'Paris', 'Brussels'), $user->addresses()->lists('city'));
424-
$this->assertEquals(array('Brussels', 'New York', 'Paris'), $user->addresses()->sortBy('city')->lists('city'));
425-
$this->assertEquals(array('Brussels', 'New York', 'Paris'), $user->addresses()->orderBy('city')->lists('city'));
426-
$this->assertEquals(array('Paris', 'New York', 'Brussels'), $user->addresses()->orderBy('city', 'desc')->lists('city'));
419+
$user->addresses()->save(new Address(array('city' => 'Paris', 'country' => 'France')));
420+
$user->addresses()->save(new Address(array('city' => 'Bruges', 'country' => 'Belgium')));
421+
$user->addresses()->save(new Address(array('city' => 'Brussels', 'country' => 'Belgium')));
422+
$user->addresses()->save(new Address(array('city' => 'Ghent', 'country' => 'Belgium')));
423+
424+
$this->assertEquals(array('Paris', 'Bruges', 'Brussels', 'Ghent'), $user->addresses()->lists('city'));
425+
$this->assertEquals(array('Bruges', 'Brussels', 'Ghent', 'Paris'), $user->addresses()->sortBy('city')->lists('city'));
426+
$this->assertEquals(array('Bruges', 'Brussels', 'Ghent', 'Paris'), $user->addresses()->orderBy('city')->lists('city'));
427+
$this->assertEquals(array('Paris', 'Ghent', 'Brussels', 'Bruges'), $user->addresses()->orderBy('city', 'desc')->lists('city'));
428+
429+
$this->assertEquals(array(), $user->addresses()->where('city', 'New York')->lists('city'));
430+
$this->assertEquals(array('Bruges', 'Brussels', 'Ghent'), $user->addresses()->where('country', 'Belgium')->lists('city'));
431+
$this->assertEquals(array('Ghent', 'Brussels', 'Bruges'), $user->addresses()->where('country', 'Belgium')->orderBy('city', 'desc')->lists('city'));
427432
}
428433

429434
public function testEmbedsOne()

0 commit comments

Comments
 (0)