diff --git a/README.md b/README.md index b16991224ddb2f975ab4c45b60a00122bf65897a..9024bb782a1304fe2fcd88091cad405507b4a233 100644 --- a/README.md +++ b/README.md @@ -288,6 +288,17 @@ Remove one or more values from an array. DB::collection('users')->where('name', 'John')->pull('items', 'boots'); DB::collection('users')->where('name', 'John')->pull('items', array('sword', 'shield')); +**Unset** + +Remove one or more fields from a document. + + DB::collection('users')->where('name', 'John')->unset('note'); + +You can also perform an unset on a model. + + $user = User::where('name', 'John')->first(); + $user->unset('note'); + ### Query Caching You may easily cache the results of a query using the remember method: diff --git a/src/Jenssegers/Mongodb/Builder.php b/src/Jenssegers/Mongodb/Builder.php index 69091ad92e4a69eb575e139ee5664db916c96bfd..9c9e3df86d4bfb15af5e61bca1d2e687cb058d4e 100644 --- a/src/Jenssegers/Mongodb/Builder.php +++ b/src/Jenssegers/Mongodb/Builder.php @@ -7,17 +7,17 @@ use Closure; class Builder extends \Illuminate\Database\Query\Builder { /** - * The database collection - * - * @var MongoCollection - */ + * The database collection + * + * @var MongoCollection + */ protected $collection; /** - * All of the available operators. - * - * @var array - */ + * All of the available operators. + * + * @var array + */ protected $conversion = array( '=' => '=', '!=' => '$ne', @@ -29,11 +29,11 @@ class Builder extends \Illuminate\Database\Query\Builder { ); /** - * Create a new query builder instance. - * - * @param Connection $connection - * @return void - */ + * Create a new query builder instance. + * + * @param Connection $connection + * @return void + */ public function __construct(Connection $connection) { $this->connection = $connection; @@ -339,24 +339,15 @@ class Builder extends \Illuminate\Database\Query\Builder { */ public function increment($column, $amount = 1, array $extra = array()) { - // build update statement - $update = array( + $query = array( '$inc' => array($column => $amount), '$set' => $extra, ); - // protect + // Protect $this->whereNotNull($column); - // perform - $result = $this->collection->update($this->compileWheres(), $update, array('multiple' => true)); - - if (1 == (int) $result['ok']) - { - return $result['n']; - } - - return 0; + return $this->performUpdate($query); } /** @@ -505,6 +496,28 @@ class Builder extends \Illuminate\Database\Query\Builder { return $this->performUpdate($query); } + /** + * Remove one or more fields. + * + * @param mixed $columns + * @return int + */ + public function dropColumn($columns) + { + if (!is_array($columns)) $columns = array($columns); + + $fields = array(); + + foreach ($columns as $column) + { + $fields[$column] = 1; + } + + $query = array('$unset' => $fields); + + return $this->performUpdate($query); + } + /** * Get a new instance of the query builder. * @@ -516,7 +529,7 @@ class Builder extends \Illuminate\Database\Query\Builder { } /** - * Perform update. + * Perform an update query. * * @param array $query * @param array $options @@ -541,7 +554,7 @@ class Builder extends \Illuminate\Database\Query\Builder { } /** - * Convert a key to MongoID if needed + * Convert a key to MongoID if needed. * * @param mixed $id * @return mixed @@ -557,10 +570,10 @@ class Builder extends \Illuminate\Database\Query\Builder { } /** - * Compile the where array - * - * @return array - */ + * Compile the where array. + * + * @return array + */ protected function compileWheres() { if (!$this->wheres) return array(); @@ -694,4 +707,21 @@ class Builder extends \Illuminate\Database\Query\Builder { return $where['sql']; } + /** + * Handle dynamic method calls into the method. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + if ($method == 'unset') + { + return call_user_func_array(array($this, 'dropColumn'), $parameters); + } + + return parent::__call($method, $parameters); + } + } \ No newline at end of file diff --git a/src/Jenssegers/Mongodb/Model.php b/src/Jenssegers/Mongodb/Model.php index 2e0ce4410583dc93e133007a911cf617f36fc654..bbefcc472bbcb91a3a42c70502785a60d79f3f49 100644 --- a/src/Jenssegers/Mongodb/Model.php +++ b/src/Jenssegers/Mongodb/Model.php @@ -213,4 +213,41 @@ abstract class Model extends \Illuminate\Database\Eloquent\Model { parent::setRawAttributes($attributes, $sync); } + /** + * Remove one or more fields. + * + * @param mixed $columns + * @return int + */ + public function dropColumn($columns) + { + if (!is_array($columns)) $columns = array($columns); + + // Unset attributes + foreach ($columns as $column) + { + $this->__unset($column); + } + + // Perform unset only on current document + return $query = $this->newQuery()->where($this->getKeyName(), $this->getKey())->unset($columns); + } + + /** + * Handle dynamic method calls into the method. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + if ($method == 'unset') + { + return call_user_func_array(array($this, 'dropColumn'), $parameters); + } + + return parent::__call($method, $parameters); + } + } \ No newline at end of file diff --git a/tests/ModelTest.php b/tests/ModelTest.php index 5b5a2af8a5ed7b98c16147d9d69f353a4dee0972..230220c9afc80338bced7550e783407e3d0e6151 100644 --- a/tests/ModelTest.php +++ b/tests/ModelTest.php @@ -278,4 +278,31 @@ class ModelTest extends PHPUnit_Framework_TestCase { $this->assertEquals($original[0], $items[0]->toArray()); } + public function testUnset() + { + $user1 = User::create(array('name' => 'John Doe', 'note1' => 'ABC', 'note2' => 'DEF')); + $user2 = User::create(array('name' => 'Jane Doe', 'note1' => 'ABC', 'note2' => 'DEF')); + + $user1->unset('note1'); + + $this->assertFalse(isset($user1->note1)); + $this->assertTrue(isset($user1->note2)); + $this->assertTrue(isset($user2->note1)); + $this->assertTrue(isset($user2->note2)); + + // Re-fetch to be sure + $user1 = User::find($user1->_id); + $user2 = User::find($user2->_id); + + $this->assertFalse(isset($user1->note1)); + $this->assertTrue(isset($user1->note2)); + $this->assertTrue(isset($user2->note1)); + $this->assertTrue(isset($user2->note2)); + + $user2->unset(array('note1', 'note2')); + + $this->assertFalse(isset($user2->note1)); + $this->assertFalse(isset($user2->note2)); + } + } \ No newline at end of file diff --git a/tests/QueryBuilderTest.php b/tests/QueryBuilderTest.php index e2f36a1775bfa97a4a48f77275fec2e06064a56f..e838f83906bba10820b8093f01247e4fba74eaeb 100644 --- a/tests/QueryBuilderTest.php +++ b/tests/QueryBuilderTest.php @@ -383,4 +383,26 @@ class QueryBuilderTest extends PHPUnit_Framework_TestCase { $this->assertEquals(1, DB::collection('items')->count()); } + public function testUnset() + { + $id1 = DB::collection('users')->insertGetId(array('name' => 'John Doe', 'note1' => 'ABC', 'note2' => 'DEF')); + $id2 = DB::collection('users')->insertGetId(array('name' => 'Jane Doe', 'note1' => 'ABC', 'note2' => 'DEF')); + + DB::collection('users')->where('name', 'John Doe')->unset('note1'); + + $user1 = DB::collection('users')->find($id1); + $user2 = DB::collection('users')->find($id2); + + $this->assertFalse(isset($user1['note1'])); + $this->assertTrue(isset($user1['note2'])); + $this->assertTrue(isset($user2['note1'])); + $this->assertTrue(isset($user2['note2'])); + + DB::collection('users')->where('name', 'Jane Doe')->unset(array('note1', 'note2')); + + $user2 = DB::collection('users')->find($id2); + $this->assertFalse(isset($user2['note1'])); + $this->assertFalse(isset($user2['note2'])); + } + } \ No newline at end of file