README.md 23.3 KB
Newer Older
Jens Segers's avatar
Jens Segers committed
1
Laravel MongoDB
Jens Segers's avatar
Jens Segers committed
2
===============
Jens Segers's avatar
Jens Segers committed
3

Jens Segers's avatar
Jens Segers committed
4
[![Latest Stable Version](http://img.shields.io/github/release/jenssegers/laravel-mongodb.svg)](https://packagist.org/packages/jenssegers/mongodb) [![Total Downloads](http://img.shields.io/packagist/dm/jenssegers/mongodb.svg)](https://packagist.org/packages/jenssegers/mongodb) [![Build Status](http://img.shields.io/travis/jenssegers/laravel-mongodb.svg)](https://travis-ci.org/jenssegers/laravel-mongodb) [![Coverage Status](http://img.shields.io/coveralls/jenssegers/laravel-mongodb.svg)](https://coveralls.io/r/jenssegers/laravel-mongodb?branch=master) [![Donate](https://img.shields.io/badge/donate-paypal-blue.svg)](https://www.paypal.me/jenssegers)
Jens Segers's avatar
Jens Segers committed
5

Jens Segers's avatar
Jens Segers committed
6
An Eloquent model and Query builder with support for MongoDB, using the original Laravel API. *This library extends the original Laravel classes, so it uses exactly the same methods.*
Jens Segers's avatar
Jens Segers committed
7

Jagdeep Singh's avatar
Jagdeep Singh committed
8 9 10
Table of contents
-----------------
* [Installation](#installation)
11
* [Upgrading](#upgrading)
Jagdeep Singh's avatar
Jagdeep Singh committed
12 13 14 15 16 17 18 19 20
* [Configuration](#configuration)
* [Eloquent](#eloquent)
* [Optional: Alias](#optional-alias)
* [Query Builder](#query-builder)
* [Schema](#schema)
* [Extensions](#extensions)
* [Troubleshooting](#troubleshooting)
* [Examples](#examples)

21 22 23
Installation
------------

24
Make sure you have the MongoDB PHP driver installed. You can find installation instructions at http://php.net/manual/en/mongodb.installation.php
25

Jens Segers's avatar
Jens Segers committed
26 27 28
**WARNING**: The old mongo PHP driver is not supported anymore in versions >= 3.0.

Installation using composer:
29

30
```
Anderson Andrade's avatar
Anderson Andrade committed
31 32
composer require jenssegers/mongodb
```
33

Jens Segers's avatar
Jens Segers committed
34
### Laravel version Compatibility
35

Jens Segers's avatar
Jens Segers committed
36
 Laravel  | Package
37 38 39
:---------|:----------
 4.2.x    | 2.0.x
 5.0.x    | 2.1.x
Jens Segers's avatar
Jens Segers committed
40
 5.1.x    | 2.2.x or 3.0.x
Jens Segers's avatar
Jens Segers committed
41
 5.2.x    | 2.3.x or 3.0.x
42

43
And add the service provider in `config/app.php`:
44

Anderson Andrade's avatar
Anderson Andrade committed
45
```php
46
Jenssegers\Mongodb\MongodbServiceProvider::class,
Anderson Andrade's avatar
Anderson Andrade committed
47
```
Jens Segers's avatar
Jens Segers committed
48

49 50 51 52 53 54 55 56
For usage with [Lumen](http://lumen.laravel.com), add the service provider in `bootstrap/app.php`. In this file, you will also need to enable Eloquent. You must however ensure that your call to `$app->withEloquent();` is **below** where you have registered the `MongodbServiceProvider`:

```php
$app->register('Jenssegers\Mongodb\MongodbServiceProvider');

$app->withEloquent();
```

Jens Segers's avatar
Jens Segers committed
57
The service provider will register a mongodb database extension with the original database manager. There is no need to register additional facades or objects. When using mongodb connections, Laravel will automatically provide you with the corresponding mongodb objects.
Jens Segers's avatar
Jens Segers committed
58

59 60 61 62 63 64 65 66 67
For usage outside Laravel, check out the [Capsule manager](https://github.com/illuminate/database/blob/master/README.md) and add:

```php
$capsule->getDatabaseManager()->extend('mongodb', function($config)
{
    return new Jenssegers\Mongodb\Connection($config);
});
```

68 69 70
Upgrading
---------

Jens Segers's avatar
Jens Segers committed
71
#### Upgrading from version 2 to 3
72

Jens Segers's avatar
Jens Segers committed
73
In this new major release which supports the new mongodb PHP extension, we also moved the location of the Model class and replaced the MySQL model class with a trait.
74

Jens Segers's avatar
Jens Segers committed
75
Please change all `Jenssegers\Mongodb\Model` references to `Jenssegers\Mongodb\Eloquent\Model` either at the top of your model files, or your registered alias.
76

Jens Segers's avatar
Jens Segers committed
77 78
```php
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
79

Jens Segers's avatar
Jens Segers committed
80
class User extends Eloquent {}
81 82
```

Jens Segers's avatar
Jens Segers committed
83
If you are using hybrid relations, your MySQL classes should now extend the original Eloquent model class `Illuminate\Database\Eloquent\Model` instead of the removed `Jenssegers\Eloquent\Model`. Instead use the new `Jenssegers\Mongodb\Eloquent\HybridRelations` trait. This should make things more clear as there is only one single model class in this package.
Jens Segers's avatar
Jens Segers committed
84 85 86 87 88 89 90 91 92 93 94 95

```php
use Jenssegers\Mongodb\Eloquent\HybridRelations;

class User extends Eloquent {

    use HybridRelations;

    protected $connection = 'mysql';

}
```
96

97 98
Embedded relations now return an `Illuminate\Database\Eloquent\Collection` rather than a custom Collection class. If you were using one of the special methods that were available, convert them to Collection operations.

Jens Segers's avatar
Jens Segers committed
99 100 101 102
```php
$books = $user->books()->sortBy('title');
```

Jens Segers's avatar
Jens Segers committed
103 104 105
Configuration
-------------

106 107
Change your default database connection name in `app/config/database.php`:

Anderson Andrade's avatar
Anderson Andrade committed
108
```php
109
'default' => env('DB_CONNECTION', 'mongodb'),
Anderson Andrade's avatar
Anderson Andrade committed
110
```
111 112

And add a new mongodb connection:
Jens Segers's avatar
Jens Segers committed
113

Anderson Andrade's avatar
Anderson Andrade committed
114
```php
Jens Segers's avatar
Jens Segers committed
115
'mongodb' => [
Anderson Andrade's avatar
Anderson Andrade committed
116
    'driver'   => 'mongodb',
117 118 119 120 121
    'host'     => env('DB_HOST', 'localhost'),
    'port'     => env('DB_PORT', 27017),
    'database' => env('DB_DATABASE', ''),
    'username' => env('DB_USERNAME', ''),
    'password' => env('DB_PASSWORD', ''),
Jens Segers's avatar
Jens Segers committed
122
    'options' => [
Jagdeep Singh's avatar
Jagdeep Singh committed
123
        'db' => 'admin' // sets the authentication database required by mongo 3
Jens Segers's avatar
Jens Segers committed
124 125
    ]
],
Anderson Andrade's avatar
Anderson Andrade committed
126
```
Jens Segers's avatar
Jens Segers committed
127

128 129
You can connect to multiple servers or replica sets with the following configuration:

Anderson Andrade's avatar
Anderson Andrade committed
130
```php
Jens Segers's avatar
Jens Segers committed
131
'mongodb' => [
Anderson Andrade's avatar
Anderson Andrade committed
132
    'driver'   => 'mongodb',
Jens Segers's avatar
Jens Segers committed
133
    'host'     => ['server1', 'server2'],
134 135 136 137
    'port'     => env('DB_PORT', 27017),
    'database' => env('DB_DATABASE', ''),
    'username' => env('DB_USERNAME', ''),
    'password' => env('DB_PASSWORD', ''),
Jens Segers's avatar
Jens Segers committed
138 139
    'options'  => ['replicaSet' => 'replicaSetName']
],
Anderson Andrade's avatar
Anderson Andrade committed
140
```
141

142
Eloquent
143 144
--------

145
This package includes a MongoDB enabled Eloquent class that you can use to define models for corresponding collections.
Jens Segers's avatar
Jens Segers committed
146

Anderson Andrade's avatar
Anderson Andrade committed
147
```php
148
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
Jens Segers's avatar
Jens Segers committed
149

Anderson Andrade's avatar
Anderson Andrade committed
150 151
class User extends Eloquent {}
```
152 153 154

Note that we did not tell Eloquent which collection to use for the `User` model. Just like the original Eloquent, the lower-case, plural name of the class will be used as the table name unless another name is explicitly specified. You may specify a custom collection (alias for table) by defining a `collection` property on your model:

Anderson Andrade's avatar
Anderson Andrade committed
155
```php
156
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
157

Anderson Andrade's avatar
Anderson Andrade committed
158
class User extends Eloquent {
159

Anderson Andrade's avatar
Anderson Andrade committed
160
    protected $collection = 'users_collection';
161

Anderson Andrade's avatar
Anderson Andrade committed
162 163
}
```
164

165
**NOTE:** Eloquent will also assume that each collection has a primary key column named id. You may define a `primaryKey` property to override this convention. Likewise, you may define a `connection` property to override the name of the database connection that should be used when utilizing the model.
Jens Segers's avatar
Jens Segers committed
166

Anderson Andrade's avatar
Anderson Andrade committed
167
```php
168
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
Jens Segers's avatar
Jens Segers committed
169

Anderson Andrade's avatar
Anderson Andrade committed
170
class MyModel extends Eloquent {
Jens Segers's avatar
Jens Segers committed
171

Anderson Andrade's avatar
Anderson Andrade committed
172
    protected $connection = 'mongodb';
173

Anderson Andrade's avatar
Anderson Andrade committed
174 175
}
```
176

Jens Segers's avatar
Jens Segers committed
177
Everything else (should) work just like the original Eloquent model. Read more about the Eloquent on http://laravel.com/docs/eloquent
178

Jens Segers's avatar
Jens Segers committed
179 180 181 182
### Optional: Alias

You may also register an alias for the MongoDB model by adding the following to the alias array in `app/config/app.php`:

Anderson Andrade's avatar
Anderson Andrade committed
183
```php
184
'Moloquent'       => 'Jenssegers\Mongodb\Eloquent\Model',
Anderson Andrade's avatar
Anderson Andrade committed
185
```
Jens Segers's avatar
Jens Segers committed
186

187
This will allow you to use the registered alias like:
wikichua's avatar
wikichua committed
188

Anderson Andrade's avatar
Anderson Andrade committed
189 190 191
```php
class MyModel extends Moloquent {}
```
wikichua's avatar
wikichua committed
192

193 194 195
Query Builder
-------------

Jens Segers's avatar
Jens Segers committed
196
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.
Jens Segers's avatar
Jens Segers committed
197

Anderson Andrade's avatar
Anderson Andrade committed
198 199
```php
$users = DB::collection('users')->get();
Jens Segers's avatar
Jens Segers committed
200

Anderson Andrade's avatar
Anderson Andrade committed
201 202
$user = DB::collection('users')->where('name', 'John')->first();
```
203

Jens Segers's avatar
Jens Segers committed
204
If you did not change your default database connection, you will need to specify it when querying.
Jens Segers's avatar
Jens Segers committed
205

Anderson Andrade's avatar
Anderson Andrade committed
206 207 208
```php
$user = DB::connection('mongodb')->collection('users')->get();
```
Jens Segers's avatar
Jens Segers committed
209

Jens Segers's avatar
Jens Segers committed
210 211
Read more about the query builder on http://laravel.com/docs/queries

212 213 214 215 216
Schema
------

The database driver also has (limited) schema builder support. You can easily manipulate collections and set indexes:

Anderson Andrade's avatar
Anderson Andrade committed
217 218 219 220 221 222 223 224
```php
Schema::create('users', function($collection)
{
    $collection->index('name');

    $collection->unique('email');
});
```
225 226 227

Supported operations are:

Jens Segers's avatar
Jens Segers committed
228 229 230
 - create and drop
 - collection
 - hasCollection
231
 - index and dropIndex (compound indexes supported as well)
232 233
 - unique
 - background, sparse, expire (MongoDB specific)
234

Jens Segers's avatar
Jens Segers committed
235
All other (unsupported) operations are implemented as dummy pass-through methods, because MongoDB does not use a predefined schema. Read more about the schema builder on http://laravel.com/docs/schema
236 237 238

Extensions
----------
239

240
### Auth
241 242 243

If you want to use Laravel's native Auth functionality, register this included service provider:

Anderson Andrade's avatar
Anderson Andrade committed
244
```php
Jens Segers's avatar
Jens Segers committed
245
'Jenssegers\Mongodb\Auth\PasswordResetServiceProvider',
Anderson Andrade's avatar
Anderson Andrade committed
246
```
247 248 249

This service provider will slightly modify the internal DatabaseReminderRepository to add support for MongoDB based password reminders. If you don't use password reminders, you don't have to register this service provider and everything else should work just fine.

250 251
### Queues

Jens Segers's avatar
Jens Segers committed
252
If you want to use MongoDB as your database backend, change the the driver in `config/queue.php`:
253 254 255

```php
'connections' => [
Jens Segers's avatar
Jens Segers committed
256
    'database' => [
257 258 259 260 261 262 263
        'driver' => 'mongodb',
        'table'  => 'jobs',
        'queue'  => 'default',
        'expire' => 60,
    ],
```

264
### Sentry
265

266
If you want to use this library with [Sentry](https://cartalyst.com/manual/sentry), then check out https://github.com/jenssegers/Laravel-MongoDB-Sentry
267

268
### Sessions
Jens Segers's avatar
Jens Segers committed
269

270
The MongoDB session driver is available in a separate package, check out https://github.com/jenssegers/Laravel-MongoDB-Session
Jens Segers's avatar
Jens Segers committed
271

Jens Segers's avatar
Jens Segers committed
272 273
Examples
--------
274

Jens Segers's avatar
Jens Segers committed
275 276
### Basic Usage

277 278
**Retrieving All Models**

Anderson Andrade's avatar
Anderson Andrade committed
279 280 281
```php
$users = User::all();
```
282 283 284

**Retrieving A Record By Primary Key**

Anderson Andrade's avatar
Anderson Andrade committed
285 286 287
```php
$user = User::find('517c43667db388101e00000f');
```
288 289 290

**Wheres**

Anderson Andrade's avatar
Anderson Andrade committed
291 292 293
```php
$users = User::where('votes', '>', 100)->take(10)->get();
```
294 295 296

**Or Statements**

Anderson Andrade's avatar
Anderson Andrade committed
297 298 299
```php
$users = User::where('votes', '>', 100)->orWhere('name', 'John')->get();
```
300

301 302
**And Statements**

Anderson Andrade's avatar
Anderson Andrade committed
303 304 305
```php
$users = User::where('votes', '>', 100)->where('name', '=', 'John')->get();
```
Jens Segers's avatar
Jens Segers committed
306

307 308
**Using Where In With An Array**

Anderson Andrade's avatar
Anderson Andrade committed
309
```php
Jens Segers's avatar
Jens Segers committed
310
$users = User::whereIn('age', [16, 18, 20])->get();
Anderson Andrade's avatar
Anderson Andrade committed
311
```
Jens Segers's avatar
Jens Segers committed
312

Jens Segers's avatar
Jens Segers committed
313
When using `whereNotIn` objects will be returned if the field is non existent. Combine with `whereNotNull('age')` to leave out those documents.
314

Jens Segers's avatar
Jens Segers committed
315 316
**Using Where Between**

Anderson Andrade's avatar
Anderson Andrade committed
317
```php
Jens Segers's avatar
Jens Segers committed
318
$users = User::whereBetween('votes', [1, 100])->get();
Anderson Andrade's avatar
Anderson Andrade committed
319
```
Jens Segers's avatar
Jens Segers committed
320

Jens Segers's avatar
Jens Segers committed
321 322
**Where null**

Anderson Andrade's avatar
Anderson Andrade committed
323 324 325
```php
$users = User::whereNull('updated_at')->get();
```
326 327 328

**Order By**

Anderson Andrade's avatar
Anderson Andrade committed
329 330 331
```php
$users = User::orderBy('name', 'desc')->get();
```
332

Jens Segers's avatar
Jens Segers committed
333 334
**Offset & Limit**

Anderson Andrade's avatar
Anderson Andrade committed
335 336 337
```php
$users = User::skip(10)->take(5)->get();
```
Jens Segers's avatar
Jens Segers committed
338

Jens Segers's avatar
Jens Segers committed
339 340 341 342
**Distinct**

Distinct requires a field for which to return the distinct values.

Anderson Andrade's avatar
Anderson Andrade committed
343
```php
Jens Segers's avatar
Jens Segers committed
344
$users = User::distinct()->get(['name']);
Anderson Andrade's avatar
Anderson Andrade committed
345 346 347
// or
$users = User::distinct('name')->get();
```
Jens Segers's avatar
Jens Segers committed
348

Jens Segers's avatar
Jens Segers committed
349 350
Distinct can be combined with **where**:

Anderson Andrade's avatar
Anderson Andrade committed
351 352 353
```php
$users = User::where('active', true)->distinct('name')->get();
```
Jens Segers's avatar
Jens Segers committed
354

355 356
**Advanced Wheres**

Anderson Andrade's avatar
Anderson Andrade committed
357 358 359 360 361 362 363 364
```php
$users = User::where('name', '=', 'John')->orWhere(function($query)
    {
        $query->where('votes', '>', 100)
              ->where('title', '<>', 'Admin');
    })
    ->get();
```
365

Jens Segers's avatar
Jens Segers committed
366 367
**Group By**

Jens Segers's avatar
Jens Segers committed
368 369
Selected columns that are not grouped will be aggregated with the $last function.

Anderson Andrade's avatar
Anderson Andrade committed
370
```php
Jens Segers's avatar
Jens Segers committed
371
$users = Users::groupBy('title')->get(['title', 'name']);
Anderson Andrade's avatar
Anderson Andrade committed
372
```
Jens Segers's avatar
Jens Segers committed
373 374

**Aggregation**
Jens Segers's avatar
Jens Segers committed
375

376 377
*Aggregations are only available for MongoDB versions greater than 2.2.*

Anderson Andrade's avatar
Anderson Andrade committed
378 379 380 381 382 383 384
```php
$total = Order::count();
$price = Order::max('price');
$price = Order::min('price');
$price = Order::avg('price');
$total = Order::sum('price');
```
Jens Segers's avatar
Jens Segers committed
385 386 387

Aggregations can be combined with **where**:

Anderson Andrade's avatar
Anderson Andrade committed
388 389 390
```php
$sold = Orders::where('sold', true)->sum('price');
```
Jens Segers's avatar
Jens Segers committed
391 392 393

**Like**

Anderson Andrade's avatar
Anderson Andrade committed
394 395 396
```php
$user = Comment::where('body', 'like', '%spam%')->get();
```
Jens Segers's avatar
Jens Segers committed
397

398
**Incrementing or decrementing a value of a column**
399

400
Perform increments or decrements (default 1) on specified attributes:
401

Anderson Andrade's avatar
Anderson Andrade committed
402 403 404 405
```php
User::where('name', 'John Doe')->increment('age');
User::where('name', 'Jaques')->decrement('weight', 50);
```
406

407
The number of updated objects is returned:
408

Anderson Andrade's avatar
Anderson Andrade committed
409 410 411
```php
$count = User->increment('age');
```
412

413
You may also specify additional columns to update:
414

Anderson Andrade's avatar
Anderson Andrade committed
415
```php
Jens Segers's avatar
Jens Segers committed
416 417
User::where('age', '29')->increment('age', 1, ['group' => 'thirty something']);
User::where('bmi', 30)->decrement('bmi', 1, ['category' => 'overweight']);
Anderson Andrade's avatar
Anderson Andrade committed
418
```
Jens Segers's avatar
Jens Segers committed
419

420 421 422 423
**Soft deleting**

When soft deleting a model, it is not actually removed from your database. Instead, a deleted_at timestamp is set on the record. To enable soft deletes for a model, apply the SoftDeletingTrait to the model:

Anderson Andrade's avatar
Anderson Andrade committed
424
```php
425
use Jenssegers\Mongodb\Eloquent\SoftDeletes;
426

Anderson Andrade's avatar
Anderson Andrade committed
427
class User extends Eloquent {
428

429
    use SoftDeletes;
430

Anderson Andrade's avatar
Anderson Andrade committed
431
    protected $dates = ['deleted_at'];
432

Anderson Andrade's avatar
Anderson Andrade committed
433 434
}
```
435 436 437

For more information check http://laravel.com/docs/eloquent#soft-deleting

438 439 440 441 442 443
### MongoDB specific operators

**Exists**

Matches documents that have the specified field.

Anderson Andrade's avatar
Anderson Andrade committed
444 445 446
```php
User::where('age', 'exists', true)->get();
```
447 448 449 450 451

**All**

Matches arrays that contain all elements specified in the query.

Anderson Andrade's avatar
Anderson Andrade committed
452
```php
Jens Segers's avatar
Jens Segers committed
453
User::where('roles', 'all', ['moderator', 'author'])->get();
Anderson Andrade's avatar
Anderson Andrade committed
454
```
455 456 457 458 459

**Size**

Selects documents if the array field is a specified size.

Anderson Andrade's avatar
Anderson Andrade committed
460 461 462
```php
User::where('tags', 'size', 3)->get();
```
463

Jens Segers's avatar
Jens Segers committed
464 465 466 467
**Regex**

Selects documents where values match a specified regular expression.

Anderson Andrade's avatar
Anderson Andrade committed
468 469 470
```php
User::where('name', 'regex', new MongoRegex("/.*doe/i"))->get();
```
Jens Segers's avatar
Jens Segers committed
471

Jens Segers's avatar
Jens Segers committed
472 473
**NOTE:** you can also use the Laravel regexp operations. These are a bit more flexible and will automatically convert your regular expression string to a MongoRegex object.

Anderson Andrade's avatar
Anderson Andrade committed
474 475 476
```php
User::where('name', 'regexp', '/.*doe/i'))->get();
```
Jens Segers's avatar
Jens Segers committed
477 478 479

And the inverse:

Anderson Andrade's avatar
Anderson Andrade committed
480 481 482
```php
User::where('name', 'not regexp', '/.*doe/i'))->get();
```
Jens Segers's avatar
Jens Segers committed
483

484 485 486 487
**Type**

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

Anderson Andrade's avatar
Anderson Andrade committed
488 489 490
```php
User::where('age', 'type', 2)->get();
```
491 492 493 494 495

**Mod**

Performs a modulo operation on the value of a field and selects documents with a specified result.

Anderson Andrade's avatar
Anderson Andrade committed
496
```php
Jens Segers's avatar
Jens Segers committed
497
User::where('age', 'mod', [10, 0])->get();
Anderson Andrade's avatar
Anderson Andrade committed
498
```
499 500 501 502 503

**Where**

Matches documents that satisfy a JavaScript expression. For more information check http://docs.mongodb.org/manual/reference/operator/query/where/#op._S_where

Jens Segers's avatar
Jens Segers committed
504 505
### Inserts, updates and deletes

506 507 508 509
Inserting, updating and deleting records works just like the original Eloquent.

**Saving a new model**

Anderson Andrade's avatar
Anderson Andrade committed
510 511 512 513 514
```php
$user = new User;
$user->name = 'John';
$user->save();
```
515 516 517

You may also use the create method to save a new model in a single line:

Anderson Andrade's avatar
Anderson Andrade committed
518
```php
Jens Segers's avatar
Jens Segers committed
519
User::create(['name' => 'John']);
Anderson Andrade's avatar
Anderson Andrade committed
520
```
521 522 523

**Updating a model**

Mohit Mamoria's avatar
Mohit Mamoria committed
524
To update a model, you may retrieve it, change an attribute, and use the save method.
525

Anderson Andrade's avatar
Anderson Andrade committed
526 527 528 529 530
```php
$user = User::first();
$user->email = 'john@foo.com';
$user->save();
```
531 532 533 534 535 536 537

*There is also support for upsert operations, check https://github.com/jenssegers/laravel-mongodb#mongodb-specific-operations*

**Deleting a model**

To delete a model, simply call the delete method on the instance:

Anderson Andrade's avatar
Anderson Andrade committed
538 539 540 541
```php
$user = User::first();
$user->delete();
```
542 543 544

Or deleting a model by its key:

Anderson Andrade's avatar
Anderson Andrade committed
545 546 547
```php
User::destroy('517c43667db388101e00000f');
```
548 549

For more information about model manipulation, check http://laravel.com/docs/eloquent#insert-update-delete
Jens Segers's avatar
Jens Segers committed
550

551 552 553 554 555 556
### Dates

Eloquent allows you to work with Carbon/DateTime objects instead of MongoDate objects. Internally, these dates will be converted to MongoDate objects when saved to the database. If you wish to use this functionality on non-default date fields you will need to manually specify them as described here: http://laravel.com/docs/eloquent#date-mutators

Example:

Anderson Andrade's avatar
Anderson Andrade committed
557
```php
558
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
559

Anderson Andrade's avatar
Anderson Andrade committed
560
class User extends Eloquent {
561

Jens Segers's avatar
Jens Segers committed
562
    protected $dates = ['birthday'];
563

Anderson Andrade's avatar
Anderson Andrade committed
564 565
}
```
566 567 568

Which allows you to execute queries like:

Anderson Andrade's avatar
Anderson Andrade committed
569 570 571
```php
$users = User::where('birthday', '>', new DateTime('-18 years'))->get();
```
572

Jens Segers's avatar
Jens Segers committed
573
### Relations
Jens Segers's avatar
Jens Segers committed
574

Jens Segers's avatar
Jens Segers committed
575
Supported relations are:
Jens Segers's avatar
Jens Segers committed
576 577 578 579

 - hasOne
 - hasMany
 - belongsTo
580
 - belongsToMany
581 582
 - embedsOne
 - embedsMany
583

Jens Segers's avatar
Jens Segers committed
584 585
Example:

Anderson Andrade's avatar
Anderson Andrade committed
586
```php
587
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
Jens Segers's avatar
Jens Segers committed
588

Anderson Andrade's avatar
Anderson Andrade committed
589
class User extends Eloquent {
Jens Segers's avatar
Jens Segers committed
590

Anderson Andrade's avatar
Anderson Andrade committed
591 592 593
    public function items()
    {
        return $this->hasMany('Item');
Jens Segers's avatar
Jens Segers committed
594 595
    }

Anderson Andrade's avatar
Anderson Andrade committed
596 597
}
```
Jens Segers's avatar
Jens Segers committed
598 599

And the inverse relation:
Jens Segers's avatar
Jens Segers committed
600

Anderson Andrade's avatar
Anderson Andrade committed
601
```php
602
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
Jens Segers's avatar
Jens Segers committed
603

Anderson Andrade's avatar
Anderson Andrade committed
604
class Item extends Eloquent {
Jens Segers's avatar
Jens Segers committed
605

Anderson Andrade's avatar
Anderson Andrade committed
606 607 608
    public function user()
    {
        return $this->belongsTo('User');
Jens Segers's avatar
Jens Segers committed
609 610
    }

Anderson Andrade's avatar
Anderson Andrade committed
611 612
}
```
Jens Segers's avatar
Jens Segers committed
613 614 615

The belongsToMany relation will not use a pivot "table", but will push id's to a __related_ids__ attribute instead. This makes the second parameter for the belongsToMany method useless. If you want to define custom keys for your relation, set it to `null`:

Anderson Andrade's avatar
Anderson Andrade committed
616
```php
617
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
Jens Segers's avatar
Jens Segers committed
618

Anderson Andrade's avatar
Anderson Andrade committed
619
class User extends Eloquent {
Jens Segers's avatar
Jens Segers committed
620

Anderson Andrade's avatar
Anderson Andrade committed
621 622 623
    public function groups()
    {
        return $this->belongsToMany('Group', null, 'users', 'groups');
Jens Segers's avatar
Jens Segers committed
624 625
    }

Anderson Andrade's avatar
Anderson Andrade committed
626 627 628
}
```

Jens Segers's avatar
Jens Segers committed
629

Shubhamoy's avatar
Shubhamoy committed
630
Other relations are not yet supported, but may be added in the future. Read more about these relations on http://laravel.com/docs/eloquent#relationships
Jens Segers's avatar
Jens Segers committed
631

632 633
### EmbedsMany Relations

Jens Segers's avatar
Jens Segers committed
634
If you want to embed models, rather than referencing them, you can use the `embedsMany` relation. This relation is similar to the `hasMany` relation, but embeds the models inside the parent object.
635

636 637
**REMEMBER**: these relations return Eloquent collections, they don't return query builder objects!

Anderson Andrade's avatar
Anderson Andrade committed
638
```php
639
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
640

Anderson Andrade's avatar
Anderson Andrade committed
641
class User extends Eloquent {
642

Anderson Andrade's avatar
Anderson Andrade committed
643 644 645
    public function books()
    {
        return $this->embedsMany('Book');
646 647
    }

Anderson Andrade's avatar
Anderson Andrade committed
648 649
}
```
Jens Segers's avatar
Jens Segers committed
650

Jens Segers's avatar
Jens Segers committed
651
You access the embedded models through the dynamic property:
652

Anderson Andrade's avatar
Anderson Andrade committed
653 654 655
```php
$books = User::first()->books;
```
656

Jens Segers's avatar
Jens Segers committed
657
The inverse relation is auto*magically* available, you don't need to define this reverse relation.
Jens Segers's avatar
Jens Segers committed
658

Anderson Andrade's avatar
Anderson Andrade committed
659 660 661
```php
$user = $book->user;
```
Jens Segers's avatar
Jens Segers committed
662

Jens Segers's avatar
Jens Segers committed
663
Inserting and updating embedded models works similar to the `hasMany` relation:
664

Anderson Andrade's avatar
Anderson Andrade committed
665
```php
Jens Segers's avatar
Jens Segers committed
666
$book = new Book(['title' => 'A Game of Thrones']);
667

Anderson Andrade's avatar
Anderson Andrade committed
668
$user = User::first();
669

Anderson Andrade's avatar
Anderson Andrade committed
670 671
$book = $user->books()->save($book);
// or
Jens Segers's avatar
Jens Segers committed
672
$book = $user->books()->create(['title' => 'A Game of Thrones'])
Anderson Andrade's avatar
Anderson Andrade committed
673
```
674

Jens Segers's avatar
Jens Segers committed
675
You can update embedded models using their `save` method (available since release 2.0.0):
676

Anderson Andrade's avatar
Anderson Andrade committed
677 678
```php
$book = $user->books()->first();
679

Anderson Andrade's avatar
Anderson Andrade committed
680
$book->title = 'A Game of Thrones';
Jens Segers's avatar
Jens Segers committed
681

Anderson Andrade's avatar
Anderson Andrade committed
682 683
$book->save();
```
Jens Segers's avatar
Jens Segers committed
684

Jens Segers's avatar
Jens Segers committed
685
You can remove an embedded model by using the `destroy` method on the relation, or the `delete` method on the model (available since release 2.0.0):
Jens Segers's avatar
Jens Segers committed
686

Anderson Andrade's avatar
Anderson Andrade committed
687 688
```php
$book = $user->books()->first();
Jens Segers's avatar
Jens Segers committed
689

Anderson Andrade's avatar
Anderson Andrade committed
690 691 692 693
$book->delete();
// or
$user->books()->destroy($book);
```
694

Jens Segers's avatar
Jens Segers committed
695
If you want to add or remove an embedded model, without touching the database, you can use the `associate` and `dissociate` methods. To eventually write the changes to the database, save the parent object:
696

Anderson Andrade's avatar
Anderson Andrade committed
697 698
```php
$user->books()->associate($book);
699

Anderson Andrade's avatar
Anderson Andrade committed
700 701
$user->save();
```
702

Jens Segers's avatar
Jens Segers committed
703
Like other relations, embedsMany assumes the local key of the relationship based on the model name. You can override the default local key by passing a second argument to the embedsMany method:
704

Anderson Andrade's avatar
Anderson Andrade committed
705 706 707
```php
return $this->embedsMany('Book', 'local_key');
```
708

709
Embedded relations will return a Collection of embedded items instead of a query builder. Check out the available operations here: https://laravel.com/docs/master/collections
Jens Segers's avatar
Jens Segers committed
710

711 712
### EmbedsOne Relations

Jens Segers's avatar
Jens Segers committed
713
The embedsOne relation is similar to the EmbedsMany relation, but only embeds a single model.
714

Anderson Andrade's avatar
Anderson Andrade committed
715
```php
716
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
717

Anderson Andrade's avatar
Anderson Andrade committed
718
class Book extends Eloquent {
719

Anderson Andrade's avatar
Anderson Andrade committed
720 721 722
    public function author()
    {
        return $this->embedsOne('Author');
723 724
    }

Anderson Andrade's avatar
Anderson Andrade committed
725 726
}
```
Jens Segers's avatar
Jens Segers committed
727

Jens Segers's avatar
Jens Segers committed
728
You access the embedded models through the dynamic property:
729

Anderson Andrade's avatar
Anderson Andrade committed
730 731 732
```php
$author = Book::first()->author;
```
733

Jens Segers's avatar
Jens Segers committed
734
Inserting and updating embedded models works similar to the `hasOne` relation:
735

Anderson Andrade's avatar
Anderson Andrade committed
736
```php
Jens Segers's avatar
Jens Segers committed
737
$author = new Author(['name' => 'John Doe']);
738

Anderson Andrade's avatar
Anderson Andrade committed
739
$book = Books::first();
Jens Segers's avatar
Jens Segers committed
740

Anderson Andrade's avatar
Anderson Andrade committed
741 742
$author = $book->author()->save($author);
// or
Jens Segers's avatar
Jens Segers committed
743
$author = $book->author()->create(['name' => 'John Doe']);
Anderson Andrade's avatar
Anderson Andrade committed
744
```
Jens Segers's avatar
Jens Segers committed
745

Jens Segers's avatar
Jens Segers committed
746
You can update the embedded model using the `save` method (available since release 2.0.0):
Jens Segers's avatar
Jens Segers committed
747

Anderson Andrade's avatar
Anderson Andrade committed
748 749
```php
$author = $book->author;
Jens Segers's avatar
Jens Segers committed
750

Anderson Andrade's avatar
Anderson Andrade committed
751 752 753
$author->name = 'Jane Doe';
$author->save();
```
Jens Segers's avatar
Jens Segers committed
754

Jens Segers's avatar
Jens Segers committed
755
You can replace the embedded model with a new model like this:
Jens Segers's avatar
Jens Segers committed
756

Anderson Andrade's avatar
Anderson Andrade committed
757
```php
Jens Segers's avatar
Jens Segers committed
758
$newAuthor = new Author(['name' => 'Jane Doe']);
Anderson Andrade's avatar
Anderson Andrade committed
759 760
$book->author()->save($newAuthor);
```
761

762 763
### MySQL Relations

764
If you're using a hybrid MongoDB and SQL setup, you're in luck! The model will automatically return a MongoDB- or SQL-relation based on the type of the related model. Of course, if you want this functionality to work both ways, your SQL-models will need use the `Jenssegers\Mongodb\Eloquent\HybridRelations` trait. Note that this functionality only works for hasOne, hasMany and belongsTo relations.
765 766 767

Example SQL-based User model:

Anderson Andrade's avatar
Anderson Andrade committed
768
```php
769
use Jenssegers\Mongodb\Eloquent\HybridRelations;
770

Anderson Andrade's avatar
Anderson Andrade committed
771
class User extends Eloquent {
772

773 774
    use HybridRelations;

Anderson Andrade's avatar
Anderson Andrade committed
775
    protected $connection = 'mysql';
776

Anderson Andrade's avatar
Anderson Andrade committed
777 778 779
    public function messages()
    {
        return $this->hasMany('Message');
780 781
    }

Anderson Andrade's avatar
Anderson Andrade committed
782 783
}
```
784 785 786

And the Mongodb-based Message model:

Anderson Andrade's avatar
Anderson Andrade committed
787
```php
788
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;
789

Anderson Andrade's avatar
Anderson Andrade committed
790
class Message extends Eloquent {
791

Anderson Andrade's avatar
Anderson Andrade committed
792
    protected $connection = 'mongodb';
793

Anderson Andrade's avatar
Anderson Andrade committed
794 795 796
    public function user()
    {
        return $this->belongsTo('User');
797 798
    }

Anderson Andrade's avatar
Anderson Andrade committed
799 800
}
```
Jens Segers's avatar
Jens Segers committed
801

Jens Segers's avatar
Jens Segers committed
802
### Raw Expressions
Jens Segers's avatar
Jens Segers committed
803 804 805

These expressions will be injected directly into the query.

Anderson Andrade's avatar
Anderson Andrade committed
806
```php
Jens Segers's avatar
Jens Segers committed
807
User::whereRaw(['age' => array('$gt' => 30, '$lt' => 40]))->get();
Anderson Andrade's avatar
Anderson Andrade committed
808
```
Jens Segers's avatar
Jens Segers committed
809

810
You can also perform raw expressions on the internal MongoCollection object. If this is executed on the model class, it will return a collection of models. If this is executed on the query builder, it will return the original response.
811

Anderson Andrade's avatar
Anderson Andrade committed
812 813 814 815 816 817 818 819 820 821 822 823 824
```php
// Returns a collection of User models.
$models = User::raw(function($collection)
{
    return $collection->find();
});

// Returns the original MongoCursor.
$cursor = DB::collection('users')->raw(function($collection)
{
    return $collection->find();
});
```
825

826
Optional: if you don't pass a closure to the raw method, the internal MongoCollection object will be accessible:
827

Anderson Andrade's avatar
Anderson Andrade committed
828
```php
Jens Segers's avatar
Jens Segers committed
829
$model = User::raw()->findOne(['age' => array('$lt' => 18]));
Anderson Andrade's avatar
Anderson Andrade committed
830
```
831

Jens Segers's avatar
Jens Segers committed
832
The internal MongoClient and MongoDB objects can be accessed like this:
833

Anderson Andrade's avatar
Anderson Andrade committed
834 835 836 837
```php
$client = DB::getMongoClient();
$db = DB::getMongoDB();
```
838

839 840
### MongoDB specific operations

841 842 843 844
**Cursor timeout**

To prevent MongoCursorTimeout exceptions, you can manually set a timeout value that will be applied to the cursor:

Anderson Andrade's avatar
Anderson Andrade committed
845 846 847
```php
DB::collection('users')->timeout(-1)->get();
```
848

Jens Segers's avatar
Jens Segers committed
849 850 851 852
**Upsert**

Update or insert a document. Additional options for the update method are passed directly to the native update method.

Anderson Andrade's avatar
Anderson Andrade committed
853 854
```php
DB::collection('users')->where('name', 'John')
Jens Segers's avatar
Jens Segers committed
855
                       ->update($data, ['upsert' => true]);
Anderson Andrade's avatar
Anderson Andrade committed
856
```
Jens Segers's avatar
Jens Segers committed
857

858 859
**Projections**

Jens Segers's avatar
Jens Segers committed
860
You can apply projections to your queries using the `project` method.
861

Anderson Andrade's avatar
Anderson Andrade committed
862
```php
Jens Segers's avatar
Jens Segers committed
863
DB::collection('items')->project(['tags' => array('$slice' => 1]))->get();
Anderson Andrade's avatar
Anderson Andrade committed
864
```
865

Jagdeep Singh's avatar
Jagdeep Singh committed
866 867 868 869
**Projections with Pagination**

```php
$limit = 25;
Jens Segers's avatar
Jens Segers committed
870
$projections = ['id', 'name'];
Jagdeep Singh's avatar
Jagdeep Singh committed
871 872 873 874
DB::collection('items')->paginate($limit, $projections);
```


Jens Segers's avatar
Jens Segers committed
875
**Push**
876

877
Add an items to an array.
878

Anderson Andrade's avatar
Anderson Andrade committed
879 880
```php
DB::collection('users')->where('name', 'John')->push('items', 'boots');
Jens Segers's avatar
Jens Segers committed
881
DB::collection('users')->where('name', 'John')->push('messages', ['from' => 'Jane Doe', 'message' => 'Hi John']);
Anderson Andrade's avatar
Anderson Andrade committed
882
```
883

884 885
If you don't want duplicate items, set the third parameter to `true`:

Anderson Andrade's avatar
Anderson Andrade committed
886 887 888
```php
DB::collection('users')->where('name', 'John')->push('items', 'boots', true);
```
889

Jens Segers's avatar
Jens Segers committed
890
**Pull**
Jens Segers's avatar
Jens Segers committed
891

892
Remove an item from an array.
Jens Segers's avatar
Jens Segers committed
893

Anderson Andrade's avatar
Anderson Andrade committed
894 895
```php
DB::collection('users')->where('name', 'John')->pull('items', 'boots');
Jens Segers's avatar
Jens Segers committed
896
DB::collection('users')->where('name', 'John')->pull('messages', ['from' => 'Jane Doe', 'message' => 'Hi John']);
Anderson Andrade's avatar
Anderson Andrade committed
897
```
Jens Segers's avatar
Jens Segers committed
898

Jens Segers's avatar
Jens Segers committed
899 900 901 902
**Unset**

Remove one or more fields from a document.

Anderson Andrade's avatar
Anderson Andrade committed
903 904 905
```php
DB::collection('users')->where('name', 'John')->unset('note');
```
Jens Segers's avatar
Jens Segers committed
906 907 908

You can also perform an unset on a model.

Anderson Andrade's avatar
Anderson Andrade committed
909 910 911 912
```php
$user = User::where('name', 'John')->first();
$user->unset('note');
```
Jens Segers's avatar
Jens Segers committed
913

Jens Segers's avatar
Jens Segers committed
914
### Query Caching
Jens Segers's avatar
Jens Segers committed
915 916 917

You may easily cache the results of a query using the remember method:

Anderson Andrade's avatar
Anderson Andrade committed
918 919 920
```php
$users = User::remember(10)->get();
```
921

Jens Segers's avatar
Jens Segers committed
922 923
*From: http://laravel.com/docs/queries#caching-queries*

924 925 926 927
### Query Logging

By default, Laravel keeps a log in memory of all queries that have been run for the current request. However, in some cases, such as when inserting a large number of rows, this can cause the application to use excess memory. To disable the log, you may use the `disableQueryLog` method:

Anderson Andrade's avatar
Anderson Andrade committed
928 929 930
```php
DB::connection()->disableQueryLog();
```
Jens Segers's avatar
Jens Segers committed
931 932

*From: http://laravel.com/docs/database#query-logging*