diff --git a/src/Illuminate/Database/Query/Builder.php b/src/Illuminate/Database/Query/Builder.php index 3fb73f8e6d36..2fe3f0ba6b6b 100755 --- a/src/Illuminate/Database/Query/Builder.php +++ b/src/Illuminate/Database/Query/Builder.php @@ -459,14 +459,17 @@ public function crossJoin($table, $first = null, $operator = null, $second = nul * * @param bool $value * @param \Closure $callback + * @param \Closure $default * @return \Illuminate\Database\Query\Builder */ - public function when($value, $callback) + public function when($value, $callback, $default = null) { $builder = $this; if ($value) { $builder = call_user_func($callback, $builder); + } elseif ($default) { + $builder = call_user_func($default, $builder); } return $builder; diff --git a/tests/Database/DatabaseQueryBuilderTest.php b/tests/Database/DatabaseQueryBuilderTest.php index ab6783b7b197..3f36254cce8f 100755 --- a/tests/Database/DatabaseQueryBuilderTest.php +++ b/tests/Database/DatabaseQueryBuilderTest.php @@ -135,6 +135,27 @@ public function testWhenCallback() $this->assertEquals('select * from "users" where "email" = ?', $builder->toSql()); } + public function testWhenCallbackWithDefault() + { + $callback = function ($query) { + return $query->where('id', '=', 1); + }; + + $default = function ($query) { + return $query->where('id', '=', 2); + }; + + $builder = $this->getBuilder(); + $builder->select('*')->from('users')->when(true, $callback, $default)->where('email', 'foo'); + $this->assertEquals('select * from "users" where "id" = ? and "email" = ?', $builder->toSql()); + $this->assertEquals([0 => 1, 1 => 'foo'], $builder->getBindings()); + + $builder = $this->getBuilder(); + $builder->select('*')->from('users')->when(false, $callback, $default)->where('email', 'foo'); + $this->assertEquals('select * from "users" where "id" = ? and "email" = ?', $builder->toSql()); + $this->assertEquals([0 => 2, 1 => 'foo'], $builder->getBindings()); + } + public function testBasicWheres() { $builder = $this->getBuilder();