Skip to content

Commit 6727b70

Browse files
committed
Merge branch 'master' into develop
2 parents 53c17fb + 6002aca commit 6727b70

File tree

7 files changed

+135
-11
lines changed

7 files changed

+135
-11
lines changed

README.md

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ This will allow you to use your registered alias like:
9494
Query Builder
9595
-------------
9696

97-
The database driver plugs right into the original query builder. When using mongodb connections you will be able to build fluent queries to perform database operations. For your convenience, there is a `collection` alias for `table` as well as some additional mongodb specific operations like `push` and `pull`.
97+
The database driver plugs right into the original query builder. When using mongodb connections you will be able to build fluent queries to perform database operations. For your convenience, there is a `collection` alias for `table` as well as some additional mongodb specific operators/operations.
9898

9999
// With custom connection
100100
$user = DB::connection('mongodb')->collection('users')->get();
@@ -236,6 +236,48 @@ You may also specify additional columns to update:
236236
User::where('age', '29')->increment('age', 1, array('group' => 'thirty something'));
237237
User::where('bmi', 30)->decrement('bmi', 1, array('category' => 'overweight'));
238238

239+
### MongoDB specific operators
240+
241+
**Exists**
242+
243+
Matches documents that have the specified field.
244+
245+
User::where('age', 'exists', true)->get();
246+
247+
**All**
248+
249+
Matches arrays that contain all elements specified in the query.
250+
251+
User::where('roles', 'all', array('moderator', 'author'))->get();
252+
253+
**Size**
254+
255+
Selects documents if the array field is a specified size.
256+
257+
User::where('tags', 'size', 3)->get();
258+
259+
**Regex**
260+
261+
Selects documents where values match a specified regular expression.
262+
263+
User::where('name', 'regex', new MongoRegex("/.*doe/i"))->get();
264+
265+
**Type**
266+
267+
Selects documents if a field is of the specified type. For more information check: http://docs.mongodb.org/manual/reference/operator/query/type/#op._S_type
268+
269+
User::where('age', 'type', 2)->get();
270+
271+
**Mod**
272+
273+
Performs a modulo operation on the value of a field and selects documents with a specified result.
274+
275+
User::where('age', 'mod', array(10, 0))->get();
276+
277+
**Where**
278+
279+
Matches documents that satisfy a JavaScript expression. For more information check http://docs.mongodb.org/manual/reference/operator/query/where/#op._S_where
280+
239281
### Inserts, updates and deletes
240282

241283
All basic insert, update, delete and select methods should be implemented.

src/Jenssegers/Mongodb/Connection.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php namespace Jenssegers\Mongodb;
22

3-
use Jenssegers\Mongodb\Builder as QueryBuilder;
3+
use Jenssegers\Mongodb\Query\Builder as QueryBuilder;
44
use MongoClient;
55

66
class Connection extends \Illuminate\Database\Connection {

src/Jenssegers/Mongodb/Model.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use Illuminate\Database\Eloquent\Relations\HasMany;
66

77
use Jenssegers\Mongodb\DatabaseManager as Resolver;
8-
use Jenssegers\Mongodb\Builder as QueryBuilder;
8+
use Jenssegers\Mongodb\Query\Builder as QueryBuilder;
99
use Jenssegers\Mongodb\Relations\BelongsTo;
1010
use Jenssegers\Mongodb\Relations\BelongsToMany;
1111

src/Jenssegers/Mongodb/Builder.php renamed to src/Jenssegers/Mongodb/Query/Builder.php

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
<?php namespace Jenssegers\Mongodb;
1+
<?php namespace Jenssegers\Mongodb\Query;
22

33
use MongoID;
44
use MongoRegex;
55
use MongoDate;
66
use DateTime;
77
use Closure;
88

9+
use Jenssegers\Mongodb\Connection;
10+
911
class Builder extends \Illuminate\Database\Query\Builder {
1012

1113
/**
@@ -16,7 +18,19 @@ class Builder extends \Illuminate\Database\Query\Builder {
1618
protected $collection;
1719

1820
/**
19-
* All of the available operators.
21+
* All of the available clause operators.
22+
*
23+
* @var array
24+
*/
25+
protected $operators = array(
26+
'=', '<', '>', '<=', '>=', '<>', '!=',
27+
'like', 'not like', 'between', 'ilike',
28+
'&', '|', '^', '<<', '>>',
29+
'exists', 'type', 'mod', 'where', 'all', 'size', 'regex',
30+
);
31+
32+
/**
33+
* Operator conversion.
2034
*
2135
* @var array
2236
*/
@@ -268,7 +282,7 @@ public function distinct($column = false)
268282
*/
269283
public function orderBy($column, $direction = 'asc')
270284
{
271-
$this->orders[$column] = ($direction == 'asc' ? 1 : -1);
285+
$this->orders[$column] = (strtolower($direction) == 'asc' ? 1 : -1);
272286

273287
return $this;
274288
}
@@ -472,7 +486,7 @@ public function from($collection)
472486
*/
473487
public function truncate()
474488
{
475-
$result = $this->collection->drop();
489+
$result = $this->collection->remove();
476490

477491
return (1 == (int) $result['ok']);
478492
}
@@ -699,10 +713,14 @@ protected function compileWhereBasic($where)
699713
{
700714
$query = array($column => $value);
701715
}
702-
else
716+
else if (array_key_exists($operator, $this->conversion))
703717
{
704718
$query = array($column => array($this->conversion[$operator] => $value));
705719
}
720+
else
721+
{
722+
$query = array($column => array('$' . $operator => $value));
723+
}
706724

707725
return $query;
708726
}

tests/ConnectionTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ public function testCollection()
3434
$this->assertInstanceOf('MongoCollection', $collection);
3535

3636
$collection = DB::connection('mongodb')->collection('unittests');
37-
$this->assertInstanceOf('Jenssegers\Mongodb\Builder', $collection);
37+
$this->assertInstanceOf('Jenssegers\Mongodb\Query\Builder', $collection);
3838

3939
$collection = DB::connection('mongodb')->table('unittests');
40-
$this->assertInstanceOf('Jenssegers\Mongodb\Builder', $collection);
40+
$this->assertInstanceOf('Jenssegers\Mongodb\Query\Builder', $collection);
4141
}
4242

4343
public function testDynamic()

tests/QueryBuilderTest.php

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public function tearDown()
1414

1515
public function testCollection()
1616
{
17-
$this->assertInstanceOf('Jenssegers\Mongodb\Builder', DB::collection('users'));
17+
$this->assertInstanceOf('Jenssegers\Mongodb\Query\Builder', DB::collection('users'));
1818
}
1919

2020
public function testGet()
@@ -195,6 +195,10 @@ public function testRaw()
195195

196196
$collection = DB::collection('users')->raw();
197197
$this->assertInstanceOf('MongoCollection', $collection);
198+
199+
$results = DB::collection('users')->whereRaw(array('age' => 20))->get();
200+
$this->assertEquals(1, count($results));
201+
$this->assertEquals('Jane Doe', $results[0]['name']);
198202
}
199203

200204
public function testPush()
@@ -445,4 +449,61 @@ public function testDates()
445449
$this->assertEquals(2, count($users));
446450
}
447451

452+
public function testOperators()
453+
{
454+
DB::collection('users')->insert(array(
455+
array('name' => 'John Doe', 'age' => 30),
456+
array('name' => 'Jane Doe'),
457+
array('name' => 'Robert Roe', 'age' => 'thirty-one'),
458+
));
459+
460+
$results = DB::collection('users')->where('age', 'exists', true)->get();
461+
$this->assertEquals(2, count($results));
462+
$this->assertEquals('John Doe', $results[0]['name']);
463+
464+
$results = DB::collection('users')->where('age', 'exists', false)->get();
465+
$this->assertEquals(1, count($results));
466+
$this->assertEquals('Jane Doe', $results[0]['name']);
467+
468+
$results = DB::collection('users')->where('age', 'type', 2)->get();
469+
$this->assertEquals(1, count($results));
470+
$this->assertEquals('Robert Roe', $results[0]['name']);
471+
472+
$results = DB::collection('users')->where('age', 'mod', array(15, 0))->get();
473+
$this->assertEquals(1, count($results));
474+
$this->assertEquals('John Doe', $results[0]['name']);
475+
476+
$results = DB::collection('users')->where('age', 'mod', array(29, 1))->get();
477+
$this->assertEquals(1, count($results));
478+
$this->assertEquals('John Doe', $results[0]['name']);
479+
480+
$results = DB::collection('users')->where('age', 'mod', array(14, 0))->get();
481+
$this->assertEquals(0, count($results));
482+
483+
DB::collection('items')->insert(array(
484+
array('name' => 'fork', 'tags' => array('sharp', 'pointy')),
485+
array('name' => 'spork', 'tags' => array('sharp', 'pointy', 'round', 'bowl')),
486+
array('name' => 'spoon', 'tags' => array('round', 'bowl')),
487+
));
488+
489+
$results = DB::collection('items')->where('tags', 'all', array('sharp', 'pointy'))->get();
490+
$this->assertEquals(2, count($results));
491+
492+
$results = DB::collection('items')->where('tags', 'all', array('sharp', 'round'))->get();
493+
$this->assertEquals(1, count($results));
494+
495+
$results = DB::collection('items')->where('tags', 'size', 2)->get();
496+
$this->assertEquals(2, count($results));
497+
498+
$results = DB::collection('items')->where('tags', 'size', 3)->get();
499+
$this->assertEquals(0, count($results));
500+
501+
$results = DB::collection('items')->where('tags', 'size', 4)->get();
502+
$this->assertEquals(1, count($results));
503+
504+
$regex = new MongoRegex("/.*doe/i");
505+
$results = DB::collection('users')->where('name', 'regex', $regex)->get();
506+
$this->assertEquals(2, count($results));
507+
}
508+
448509
}

tests/QueryTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,9 @@ public function testOrder()
142142
$user = User::whereNotNull('age')->orderBy('age', 'asc')->first();
143143
$this->assertEquals(13, $user->age);
144144

145+
$user = User::whereNotNull('age')->orderBy('age', 'ASC')->first();
146+
$this->assertEquals(13, $user->age);
147+
145148
$user = User::whereNotNull('age')->orderBy('age', 'desc')->first();
146149
$this->assertEquals(37, $user->age);
147150
}

0 commit comments

Comments
 (0)