diff --git a/lib/Doctrine/ORM/QueryBuilder.php b/lib/Doctrine/ORM/QueryBuilder.php index 5755a6cfc..51ef27706 100644 --- a/lib/Doctrine/ORM/QueryBuilder.php +++ b/lib/Doctrine/ORM/QueryBuilder.php @@ -429,7 +429,7 @@ class QueryBuilder * * @param mixed $key The key (index or name) of the bound parameter. * - * @return mixed The value of the bound parameter. + * @return Query\Parameter|null The value of the bound parameter. */ public function getParameter($key) { @@ -1169,5 +1169,13 @@ class QueryBuilder $this->_dqlParts[$part] = clone $elements; } } + + $parameters = array(); + + foreach ($this->parameters as $parameter) { + $parameters[] = clone $parameter; + } + + $this->parameters = new ArrayCollection($parameters); } } diff --git a/lib/Doctrine/ORM/Tools/Console/Command/ClearCache/MetadataCommand.php b/lib/Doctrine/ORM/Tools/Console/Command/ClearCache/MetadataCommand.php index d23fb5a30..c01d964b8 100644 --- a/lib/Doctrine/ORM/Tools/Console/Command/ClearCache/MetadataCommand.php +++ b/lib/Doctrine/ORM/Tools/Console/Command/ClearCache/MetadataCommand.php @@ -27,7 +27,7 @@ use Symfony\Component\Console\Input\InputArgument, /** * Command to clear the metadata cache of the various cache drivers. * - * + * * @link www.doctrine-project.org * @since 2.0 * @author Benjamin Eberlei @@ -52,20 +52,19 @@ class MetadataCommand extends Console\Command\Command ) )); - $fullName = $this->getName(); $this->setHelp(<<$fullName command is meant to clear the metadata cache of associated Entity Manager. +The %command.name% command is meant to clear the metadata cache of associated Entity Manager. It is possible to invalidate all cache entries at once - called delete -, or flushes the cache provider instance completely. The execution type differ on how you execute the command. If you want to invalidate the entries (and not delete from cache instance), this command would do the work: -$fullName +%command.name% Alternatively, if you want to flush the cache provider using this command: -$fullName --flush +%command.name% --flush Finally, be aware that if --flush option is passed, not all cache providers are able to flush entries, because of a limitation of its execution nature. diff --git a/lib/Doctrine/ORM/Tools/Console/Command/ClearCache/QueryCommand.php b/lib/Doctrine/ORM/Tools/Console/Command/ClearCache/QueryCommand.php index c6e415e25..a984b9603 100644 --- a/lib/Doctrine/ORM/Tools/Console/Command/ClearCache/QueryCommand.php +++ b/lib/Doctrine/ORM/Tools/Console/Command/ClearCache/QueryCommand.php @@ -27,7 +27,7 @@ use Symfony\Component\Console\Input\InputArgument, /** * Command to clear the query cache of the various cache drivers. * - * + * * @link www.doctrine-project.org * @since 2.0 * @author Benjamin Eberlei @@ -52,20 +52,19 @@ class QueryCommand extends Console\Command\Command ) )); - $fullName = $this->getName(); $this->setHelp(<<$fullName command is meant to clear the query cache of associated Entity Manager. +The %command.name% command is meant to clear the query cache of associated Entity Manager. It is possible to invalidate all cache entries at once - called delete -, or flushes the cache provider instance completely. The execution type differ on how you execute the command. If you want to invalidate the entries (and not delete from cache instance), this command would do the work: -$fullName +%command.name% Alternatively, if you want to flush the cache provider using this command: -$fullName --flush +%command.name% --flush Finally, be aware that if --flush option is passed, not all cache providers are able to flush entries, because of a limitation of its execution nature. diff --git a/lib/Doctrine/ORM/Tools/Console/Command/ClearCache/ResultCommand.php b/lib/Doctrine/ORM/Tools/Console/Command/ClearCache/ResultCommand.php index b469e3e0f..096aa53a7 100644 --- a/lib/Doctrine/ORM/Tools/Console/Command/ClearCache/ResultCommand.php +++ b/lib/Doctrine/ORM/Tools/Console/Command/ClearCache/ResultCommand.php @@ -27,7 +27,7 @@ use Symfony\Component\Console\Input\InputArgument, /** * Command to clear the result cache of the various cache drivers. * - * + * * @link www.doctrine-project.org * @since 2.0 * @author Benjamin Eberlei @@ -52,20 +52,19 @@ class ResultCommand extends Console\Command\Command ) )); - $fullName = $this->getName(); $this->setHelp(<<$fullName command is meant to clear the result cache of associated Entity Manager. +The %command.name% command is meant to clear the result cache of associated Entity Manager. It is possible to invalidate all cache entries at once - called delete -, or flushes the cache provider instance completely. The execution type differ on how you execute the command. If you want to invalidate the entries (and not delete from cache instance), this command would do the work: -$fullName +%command.name% Alternatively, if you want to flush the cache provider using this command: -$fullName --flush +%command.name% --flush Finally, be aware that if --flush option is passed, not all cache providers are able to flush entries, because of a limitation of its execution nature. diff --git a/lib/Doctrine/ORM/Tools/Console/Command/InfoCommand.php b/lib/Doctrine/ORM/Tools/Console/Command/InfoCommand.php index 5494d71f3..b0902bab4 100644 --- a/lib/Doctrine/ORM/Tools/Console/Command/InfoCommand.php +++ b/lib/Doctrine/ORM/Tools/Console/Command/InfoCommand.php @@ -27,7 +27,7 @@ use Symfony\Component\Console\Command\Command; /** * Show information about mapped entities * - * + * * @link www.doctrine-project.org * @since 2.1 * @author Benjamin Eberlei @@ -40,7 +40,7 @@ class InfoCommand extends Command ->setName('orm:info') ->setDescription('Show basic information about all mapped entities') ->setHelp(<<doctrine:mapping:info shows basic information about which +The %command.name% shows basic information about which entities exist and possibly if their mapping information contains errors or not. EOT diff --git a/lib/Doctrine/ORM/Tools/Console/Command/SchemaTool/UpdateCommand.php b/lib/Doctrine/ORM/Tools/Console/Command/SchemaTool/UpdateCommand.php index 897229f30..26552cc45 100644 --- a/lib/Doctrine/ORM/Tools/Console/Command/SchemaTool/UpdateCommand.php +++ b/lib/Doctrine/ORM/Tools/Console/Command/SchemaTool/UpdateCommand.php @@ -29,7 +29,7 @@ use Symfony\Component\Console\Input\InputArgument, * Command to generate the SQL needed to update the database schema to match * the current mapping information. * - * + * * @link www.doctrine-project.org * @since 2.0 * @author Benjamin Eberlei @@ -68,20 +68,19 @@ class UpdateCommand extends AbstractCommand ), )); - $fullName = $this->getName(); $this->setHelp(<<$fullName command generates the SQL needed to +The %command.name% command generates the SQL needed to synchronize the database schema with the current mapping metadata of the default entity manager. For example, if you add metadata for a new column to an entity, this command would generate and output the SQL needed to add the new column to the database: -$fullName --dump-sql +%command.name% --dump-sql Alternatively, you can execute the generated queries: -$fullName --force +%command.name% --force Finally, be aware that if the --complete option is passed, this task will drop all database assets (e.g. tables, etc) that are *not* described diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1925Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1925Test.php new file mode 100644 index 000000000..869da8322 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC1925Test.php @@ -0,0 +1,182 @@ +_schemaTool->createSchema(array( + $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC1925User'), + $this->_em->getClassMetadata(__NAMESPACE__ . '\\DDC1925Product'), + )); + + $user = new DDC1925User(); + $user->setTitle("Test User"); + $this->_em->persist($user); + + $product = new DDC1925Product(); + $product->setTitle("Test product"); + $this->_em->persist($product); + $this->_em->flush(); + + $product->addBuyer($user); + + $this->_em->getUnitOfWork()->computeChangeSets(); + + $this->_em->persist($product); + $this->_em->flush(); + } +} + +/** + * @Table + * @Entity + */ +class DDC1925Product +{ + /** + * @var integer $id + * + * @Column(name="id", type="integer") + * @Id + * @GeneratedValue(strategy="AUTO") + */ + private $id; + + /** + * @var string $title + * + * @Column(name="title", type="string", length=255) + */ + private $title; + + /** + * @ManyToMany(targetEntity="DDC1925User") + * @JoinTable( + * name="user_purchases", + * joinColumns={@JoinColumn(name="product_id", referencedColumnName="id")}, + * inverseJoinColumns={@JoinColumn(name="user_id", referencedColumnName="id")} + * ) + */ + private $buyers; + + /** + * Default constructor + */ + public function __construct() + { + $this->buyers = new ArrayCollection(); + } + + /** + * @return integer + */ + public function getId() + { + return $this->id; + } + + /** + * @param string $title + */ + public function setTitle($title) + { + $this->title = $title; + } + + /** + * Get title + * + * @return string + */ + public function getTitle() + { + return $this->title; + } + + /** + * @param string $buyers + */ + public function setBuyers($buyers) + { + $this->buyers = $buyers; + } + + /** + * @return string + */ + public function getBuyers() + { + return $this->buyers; + } + + /** + * @param DDC1925User $buyer + */ + public function addBuyer(DDC1925User $buyer) + { + $this->buyers[] = $buyer; + } +} + +/** + * @Table + * @Entity + */ +class DDC1925User +{ + /** + * @var integer + * + * @Column(name="id", type="integer") + * @Id + * @GeneratedValue(strategy="AUTO") + */ + private $id; + + /** + * @var string + * + * @Column(name="title", type="string", length=255) + */ + private $title; + + /** + * Get id + * + * @return integer + */ + public function getId() + { + return $this->id; + } + + /** + * Set title + * + * @param string $title + */ + public function setTitle($title) + { + $this->title = $title; + } + + /** + * Get title + * + * @return string + */ + public function getTitle() + { + return $this->title; + } +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/QueryBuilderTest.php b/tests/Doctrine/Tests/ORM/QueryBuilderTest.php index 60a0e3dfa..82ee08ba4 100644 --- a/tests/Doctrine/Tests/ORM/QueryBuilderTest.php +++ b/tests/Doctrine/Tests/ORM/QueryBuilderTest.php @@ -664,6 +664,23 @@ class QueryBuilderTest extends \Doctrine\Tests\OrmTestCase $this->assertEquals(2, $expr->count(), "Modifying the second query should affect the first one."); } + /** + * @group DDC-1933 + */ + public function testParametersAreCloned() + { + $originalQb = new QueryBuilder($this->_em); + + $originalQb->setParameter('parameter1', 'value1'); + + $copy = clone $originalQb; + $copy->setParameter('parameter2', 'value2'); + + $this->assertCount(1, $originalQb->getParameters()); + $this->assertSame('value1', $copy->getParameter('parameter1')->getValue()); + $this->assertSame('value2', $copy->getParameter('parameter2')->getValue()); + } + public function testGetRootAlias() { $qb = $this->_em->createQueryBuilder()