diff --git a/src/Sql/Predicate/PredicateSet.php b/src/Sql/Predicate/PredicateSet.php index 2e06383b1f..71cfe6a182 100644 --- a/src/Sql/Predicate/PredicateSet.php +++ b/src/Sql/Predicate/PredicateSet.php @@ -78,7 +78,7 @@ public function addPredicates($predicates, $combination = self::OP_AND) $this->addPredicate($predicates, $combination); return $this; } - if ($predicates instanceof \Closure) { + if ($predicates instanceof \Closure || \is_callable($predicates)) { $predicates($this); return $this; } diff --git a/test/Sql/DeleteTest.php b/test/Sql/DeleteTest.php index 30d63757b4..f99acbe6ba 100644 --- a/test/Sql/DeleteTest.php +++ b/test/Sql/DeleteTest.php @@ -13,6 +13,7 @@ use Zend\Db\Sql\Predicate\IsNotNull; use Zend\Db\Sql\TableIdentifier; use Zend\Db\Sql\Where; +use ZendTest\Db\TestAsset\WhereInvokable; class DeleteTest extends \PHPUnit_Framework_TestCase { @@ -105,6 +106,25 @@ public function testWhere() }); } + /** + * @testdox unit test: test where will accept invokable classes + * @covers Zend\Db\Sql\Update::where + */ + public function testWhereArgumentCanBeInvokable() + { + $select = new Delete; + $select->where(new WhereInvokable('bar')); + + /** @var Where $where */ + $where = $select->getRawState('where'); + $predicates = $where->getPredicates(); + $expressionData = $predicates[0][1]->getExpressionData(); + + $this->assertEquals(1, count($predicates)); + $this->assertEquals('foo', $expressionData[0][1][0]); + $this->assertEquals('bar', $expressionData[0][1][1]); + } + /** * @covers Zend\Db\Sql\Delete::prepareStatement */ diff --git a/test/Sql/SelectTest.php b/test/Sql/SelectTest.php index 050b6a8b27..46c752da7c 100644 --- a/test/Sql/SelectTest.php +++ b/test/Sql/SelectTest.php @@ -19,6 +19,7 @@ use Zend\Db\Sql\TableIdentifier; use Zend\Db\Sql\Where; use ZendTest\Db\TestAsset\TrustingSql92Platform; +use ZendTest\Db\TestAsset\WhereInvokable; class SelectTest extends \PHPUnit_Framework_TestCase { @@ -348,6 +349,25 @@ public function testWhereArgument1IsClosure() }); } + /** + * @testdox unit test: test where will accept invokable classes + * @covers Zend\Db\Sql\Select::where + */ + public function testWhereArgumentCanBeInvokable() + { + $select = new Select; + $select->where(new WhereInvokable('bar')); + + /** @var Where $where */ + $where = $select->getRawState('where'); + $predicates = $where->getPredicates(); + $expressionData = $predicates[0][1]->getExpressionData(); + + $this->assertEquals(1, count($predicates)); + $this->assertEquals('foo', $expressionData[0][1][0]); + $this->assertEquals('bar', $expressionData[0][1][1]); + } + /** * @testdox unit test: Test where() will accept any Predicate object as-is * @covers Zend\Db\Sql\Select::where diff --git a/test/Sql/UpdateTest.php b/test/Sql/UpdateTest.php index a2e9b8a3d4..26e99af788 100644 --- a/test/Sql/UpdateTest.php +++ b/test/Sql/UpdateTest.php @@ -15,6 +15,7 @@ use Zend\Db\Sql\Expression; use Zend\Db\Sql\TableIdentifier; use ZendTest\Db\TestAsset\TrustingSql92Platform; +use ZendTest\Db\TestAsset\WhereInvokable; class UpdateTest extends \PHPUnit_Framework_TestCase { @@ -168,6 +169,25 @@ public function testGetRawState() $this->assertInstanceOf('Zend\Db\Sql\Where', $this->update->getRawState('where')); } + /** + * @testdox unit test: test where will accept invokable classes + * @covers Zend\Db\Sql\Update::where + */ + public function testWhereArgumentCanBeInvokable() + { + $select = new Update; + $select->where(new WhereInvokable('bar')); + + /** @var Where $where */ + $where = $select->getRawState('where'); + $predicates = $where->getPredicates(); + $expressionData = $predicates[0][1]->getExpressionData(); + + $this->assertEquals(1, count($predicates)); + $this->assertEquals('foo', $expressionData[0][1][0]); + $this->assertEquals('bar', $expressionData[0][1][1]); + } + /** * @covers Zend\Db\Sql\Update::prepareStatement */ diff --git a/test/TestAsset/WhereInvokable.php b/test/TestAsset/WhereInvokable.php new file mode 100644 index 0000000000..5a332dad34 --- /dev/null +++ b/test/TestAsset/WhereInvokable.php @@ -0,0 +1,27 @@ +value = $value; + } + + public function __invoke($select) + { + $select->where->addPredicate(new Like('foo', $this->value)); + } + +} \ No newline at end of file