diff --git a/src/QueryBuilder.php b/src/QueryBuilder.php index 64eb91ea..96d78cd5 100755 --- a/src/QueryBuilder.php +++ b/src/QueryBuilder.php @@ -130,6 +130,16 @@ public function __call($name, $arguments) return $result; } + + public function clone() + { + return clone $this; + } + + public function __clone() + { + $this->subject = clone $this->subject; + } public function __get($name) { diff --git a/tests/QueryBuilderTest.php b/tests/QueryBuilderTest.php index 8c4e206b..333d1d81 100644 --- a/tests/QueryBuilderTest.php +++ b/tests/QueryBuilderTest.php @@ -297,4 +297,33 @@ public function it_does_not_lose_pivot_values_with_belongs_to_many_relation() $foundTestModel->pivot->location ); } + + + /** @test */ + public function it_clones_the_subject_upon_cloning() + { + $queryBuilder = QueryBuilder::for(TestModel::class); + + $queryBuilder1 = (clone $queryBuilder)->where('id', 1); + $queryBuilder2 = (clone $queryBuilder)->where('name', 'John Doe'); + + $this->assertNotSame( + $queryBuilder1->toSql(), + $queryBuilder2->toSql() + ); + } + + /** @test */ + public function it_supports_clone_as_method() + { + $queryBuilder = QueryBuilder::for(TestModel::class); + + $queryBuilder1 = $queryBuilder->clone()->where('id', 1); + $queryBuilder2 = $queryBuilder->clone()->where('name', 'John Doe'); + + $this->assertNotSame( + $queryBuilder1->toSql(), + $queryBuilder2->toSql() + ); + } }