Commit ac1bd369 authored by Jens Segers's avatar Jens Segers

Added , fixes #34

parent 5b93d89b
...@@ -288,6 +288,17 @@ Remove one or more values from an array. ...@@ -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', 'boots');
DB::collection('users')->where('name', 'John')->pull('items', array('sword', 'shield')); 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 ### Query Caching
You may easily cache the results of a query using the remember method: You may easily cache the results of a query using the remember method:
......
...@@ -339,24 +339,15 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -339,24 +339,15 @@ class Builder extends \Illuminate\Database\Query\Builder {
*/ */
public function increment($column, $amount = 1, array $extra = array()) public function increment($column, $amount = 1, array $extra = array())
{ {
// build update statement $query = array(
$update = array(
'$inc' => array($column => $amount), '$inc' => array($column => $amount),
'$set' => $extra, '$set' => $extra,
); );
// protect // Protect
$this->whereNotNull($column); $this->whereNotNull($column);
// perform return $this->performUpdate($query);
$result = $this->collection->update($this->compileWheres(), $update, array('multiple' => true));
if (1 == (int) $result['ok'])
{
return $result['n'];
}
return 0;
} }
/** /**
...@@ -505,6 +496,28 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -505,6 +496,28 @@ class Builder extends \Illuminate\Database\Query\Builder {
return $this->performUpdate($query); 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. * Get a new instance of the query builder.
* *
...@@ -516,7 +529,7 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -516,7 +529,7 @@ class Builder extends \Illuminate\Database\Query\Builder {
} }
/** /**
* Perform update. * Perform an update query.
* *
* @param array $query * @param array $query
* @param array $options * @param array $options
...@@ -541,7 +554,7 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -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 * @param mixed $id
* @return mixed * @return mixed
...@@ -557,7 +570,7 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -557,7 +570,7 @@ class Builder extends \Illuminate\Database\Query\Builder {
} }
/** /**
* Compile the where array * Compile the where array.
* *
* @return array * @return array
*/ */
...@@ -694,4 +707,21 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -694,4 +707,21 @@ class Builder extends \Illuminate\Database\Query\Builder {
return $where['sql']; 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
...@@ -213,4 +213,41 @@ abstract class Model extends \Illuminate\Database\Eloquent\Model { ...@@ -213,4 +213,41 @@ abstract class Model extends \Illuminate\Database\Eloquent\Model {
parent::setRawAttributes($attributes, $sync); 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
...@@ -278,4 +278,31 @@ class ModelTest extends PHPUnit_Framework_TestCase { ...@@ -278,4 +278,31 @@ class ModelTest extends PHPUnit_Framework_TestCase {
$this->assertEquals($original[0], $items[0]->toArray()); $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
...@@ -383,4 +383,26 @@ class QueryBuilderTest extends PHPUnit_Framework_TestCase { ...@@ -383,4 +383,26 @@ class QueryBuilderTest extends PHPUnit_Framework_TestCase {
$this->assertEquals(1, DB::collection('items')->count()); $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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment