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.
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:
......
......@@ -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,7 +570,7 @@ class Builder extends \Illuminate\Database\Query\Builder {
}
/**
* Compile the where array
* Compile the where array.
*
* @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
......@@ -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
......@@ -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
......@@ -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
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