Commit 9f601636 authored by Jens Segers's avatar Jens Segers

Add unique parameter for push, fixes #91

parent 379fcba8
...@@ -422,6 +422,10 @@ Add an items to an array. ...@@ -422,6 +422,10 @@ Add an items to an array.
DB::collection('users')->where('name', 'John')->push('items', 'boots'); DB::collection('users')->where('name', 'John')->push('items', 'boots');
DB::collection('users')->where('name', 'John')->push('messages', array('from' => 'Jane Doe', 'message' => 'Hi John')); DB::collection('users')->where('name', 'John')->push('messages', array('from' => 'Jane Doe', 'message' => 'Hi John'));
If you don't want duplicate items, set the third parameter to `true`:
DB::collection('users')->where('name', 'John')->push('items', 'boots', true);
**Pull** **Pull**
Remove an item from an array. Remove an item from an array.
......
...@@ -522,15 +522,18 @@ class Builder extends \Illuminate\Database\Query\Builder { ...@@ -522,15 +522,18 @@ class Builder extends \Illuminate\Database\Query\Builder {
* @param mixed $value * @param mixed $value
* @return int * @return int
*/ */
public function push($column, $value = null) public function push($column, $value = null, $unique = false)
{ {
// Use the addToSet operator in case we only want unique items.
$operator = $unique ? '$addToSet' : '$push';
if (is_array($column)) if (is_array($column))
{ {
$query = array('$push' => $column); $query = array($operator => $column);
} }
else else
{ {
$query = array('$push' => array($column => $value)); $query = array($operator => array($column => $value));
} }
return $this->performUpdate($query); return $this->performUpdate($query);
......
...@@ -217,15 +217,22 @@ class QueryBuilderTest extends PHPUnit_Framework_TestCase { ...@@ -217,15 +217,22 @@ class QueryBuilderTest extends PHPUnit_Framework_TestCase {
$this->assertEquals('tag1', $user['tags'][0]); $this->assertEquals('tag1', $user['tags'][0]);
DB::collection('users')->where('_id', $id)->push('tags', 'tag2'); DB::collection('users')->where('_id', $id)->push('tags', 'tag2');
$user = DB::collection('users')->find($id); $user = DB::collection('users')->find($id);
$this->assertTrue(is_array($user['tags']));
$this->assertEquals(2, count($user['tags'])); $this->assertEquals(2, count($user['tags']));
$this->assertEquals('tag2', $user['tags'][1]); $this->assertEquals('tag2', $user['tags'][1]);
// Add duplicate
DB::collection('users')->where('_id', $id)->push('tags', 'tag2');
$user = DB::collection('users')->find($id);
$this->assertEquals(3, count($user['tags']));
// Add unique
DB::collection('users')->where('_id', $id)->push('tags', 'tag1', true);
$user = DB::collection('users')->find($id);
$this->assertEquals(3, count($user['tags']));
$message = array('from' => 'Jane', 'body' => 'Hi John'); $message = array('from' => 'Jane', 'body' => 'Hi John');
DB::collection('users')->where('_id', $id)->push('messages', $message); DB::collection('users')->where('_id', $id)->push('messages', $message);
$user = DB::collection('users')->find($id); $user = DB::collection('users')->find($id);
$this->assertTrue(is_array($user['messages'])); $this->assertTrue(is_array($user['messages']));
$this->assertEquals($message, $user['messages'][0]); $this->assertEquals($message, $user['messages'][0]);
......
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