[DDC-2467] Incorrect work with default values, indexes, autoincrement (patch attached) Created: 23/May/13 Updated: 23/May/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Mapping Drivers, ORM, Tools |
| Affects Version/s: | 2.3.4 |
| Fix Version/s: | None |
| Type: | Improvement | Priority: | Minor |
| Reporter: | And | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Description |
|
If you use in your MySQL database default values, indexes or string primary key, you get incorrect mapping by mapping generator. For get it - just use in database one or more from listed abilities, generate mapping for that and then try to dump-sql with schema-tool:update. Hope you fix it. Tnx! |
| Comments |
| Comment by Marco Pivetta [ 23/May/13 ] |
|
Marked as minor improvement - thank you for the patch! |
[DDC-2464] useless index for the middle table of many-to-many relationship Created: 21/May/13 Updated: 21/May/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Tools |
| Affects Version/s: | Git Master |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | scourgen | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | ddl, schematool | ||
| Description |
|
I have entity A and B, the relationship between A and B is many-to-many. which means Doctrine2 will generate a middle table called AB for me. entity A:
class Station {
/**
* @ORM\ManyToMany(targetEntity="Fun", mappedBy="stations")
*/
protected $funs;
}
entity B:
class Fun {
/**
* @ORM\ManyToMany(targetEntity="Station", inversedBy="funs")
* @ORM\JoinTable(name="stations_have_funs")
*/
protected $stations;
}
the schema of middle table stations_have_funs: CREATE TABLE `stations_have_funs` ( `fun_id` int(11) NOT NULL, `station_id` int(11) NOT NULL, PRIMARY KEY (`fun_id`,`station_id`), KEY `IDX_45C921911CA4BE49` (`fun_id`), KEY `IDX_45C9219121BDB235` (`station_id`), CONSTRAINT `FK_45C921911CA4BE49` FOREIGN KEY (`fun_id`) REFERENCES `funs` (`id`) ON DELETE CASCADE, CONSTRAINT `FK_45C9219121BDB235` FOREIGN KEY (`station_id`) REFERENCES `stations` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; I noticed that there are 2 useless index(fun_id and station_id). Since fun_id and station_id are the primary key of this table. Do we really need 2 extra/duplicated index ? |
[DDC-2462] [GH-674] Shortcut for force Created: 20/May/13 Updated: 20/May/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Doctrine Bot | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
This issue is created automatically through a Github pull request on behalf of TorbenBr: Url: https://github.com/doctrine/doctrine2/pull/674 Message: |
[DDC-2459] ANSI compliant quote strategy. Created: 17/May/13 Updated: 17/May/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Fabio B. Silva | Assignee: | Fabio B. Silva |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
In order to simplify and speed up the sql generation The implementation would be something like : <?php class AnsiQuoteStrategy implements \Doctrine\ORM\Mapping\QuoteStrategy { /** * {@inheritdoc} */ public function getColumnName($fieldName, ClassMetadata $class, AbstractPlatform $platform) { return $class->fieldMappings[$fieldName]['columnName']; } /** * {@inheritdoc} */ public function getTableName(ClassMetadata $class, AbstractPlatform $platform) { return $class->table['name']; } /** * {@inheritdoc} */ public function getSequenceName(array $definition, ClassMetadata $class, AbstractPlatform $platform) { return $definition['sequenceName']; } /** * {@inheritdoc} */ public function getJoinColumnName(array $joinColumn, ClassMetadata $class, AbstractPlatform $platform) { return $joinColumn['name']; } /** * {@inheritdoc} */ public function getReferencedJoinColumnName(array $joinColumn, ClassMetadata $class, AbstractPlatform $platform) { return $joinColumn['referencedColumnName']; } /** * {@inheritdoc} */ public function getJoinTableName(array $association, ClassMetadata $class, AbstractPlatform $platform) { return $association['joinTable']['name']; } /** * {@inheritdoc} */ public function getIdentifierColumnNames(ClassMetadata $class, AbstractPlatform $platform) { return $class->identifier; } /** * {@inheritdoc} */ public function getColumnAlias($columnName, $counter, AbstractPlatform $platform, ClassMetadata $class = null) { return $platform->getSQLResultCashing($columnName . $counter); } } |
[DDC-2454] To-Many OrderBy mechanism should allow many-to-one associations Created: 16/May/13 Updated: 16/May/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Oleg Namaka | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | association, orderBy | ||
| Description |
class ProductCategory
{
/**
* Store
*
* @var Store
*
* @ORM\ManyToOne(targetEntity="Store")
* @ORM\JoinColumn(name="store_id", referencedColumnName="store_id")
*/
private $Store;
/**
* storeId (for ordering in Product::ProductCategories only)
*
* @var integer
*
* @ORM\Column(name="store_id", type="integer")
*/
private $storeId;
...
class Product
{
/**
* Associated categories
*
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\OneToMany(targetEntity="ProductCategory", mappedBy="Product")
* @ORM\OrderBy({"storeId"="ASC"})
*/
private $ProductCategories;
}
}
If it is possible now to sort the ProductCategories collection by the storeId field, it should also be possible to sort them by the Store association. Currently a set of two fields is required: Store as a regular Many-To-One association and if a need arises to be able to use it to sort the One-To-Many collections then storeId needs to be added to the ProductCategory entity. In that case the ProductCategory entity does not pass the schema validation but is perfectly usable. This should be allowed:
class Product
{
/**
* Associated categories
*
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\OneToMany(targetEntity="ProductCategory", mappedBy="Product")
* @ORM\OrderBy({"Store"="ASC"})
*/
private $ProductCategories;
}
|
[DDC-2381] Pagination query can be simplified when simple joins are applied Created: 31/Mar/13 Updated: 08/Apr/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.3, 2.4 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Sergey Gerdel | Assignee: | Marco Pivetta |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | paginator | ||
| Attachments: |
|
| Description |
|
Hi. SELECT DISTINCT id0 FROM (SELECT m0_.id AS id0, m0_.title AS title1, m0_.text AS text2, m0_.price AS price3, m0_.originalPrice AS originalPrice4, m0_.condition_type AS condition_type5, m0_.image_1 AS image_16, m0_.image_2 AS image_27, m0_.image_3 AS image_38, m0_.image_4 AS image_49, m0_.image_5 AS image_510, m0_.video AS video11, m0_.contact_email AS contact_email12, m0_.contact_name AS contact_name13, m0_.contact_phone AS contact_phone14, m0_.contact_type AS contact_type15, m0_.published AS published16, m0_.type AS type17, m0_.status AS status18, m0_.highlight AS highlight19, m0_.urgent AS urgent20, m0_.topads AS topads21, m0_.period AS period22, m0_.hits AS hits23, m0_.ip AS ip24, m0_.created_at AS created_at25, m0_.updated_at AS updated_at26 FROM milla_message m0_ INNER JOIN milla_currency m1_ ON m0_.currency_id = m1_.id INNER JOIN milla_category m2_ ON m0_.category_id = m2_.id INNER JOIN milla_region m3_ ON m0_.region_id = m3_.id INNER JOIN milla_city m4_ ON m0_.city_id = m4_.id WHERE m0_.status = 1 ORDER BY m0_.published DESC) dctrn_result LIMIT 20 OFFSET 0 why SELECT DISTINCT %s FROM (%s) dctrn_result ??? |
| Comments |
| Comment by Marco Pivetta [ 31/Mar/13 ] |
|
Not a blocker |
| Comment by Marco Pivetta [ 31/Mar/13 ] |
|
What's the result of `EXPLAIN` on a query without the subquery? |
| Comment by Sergey Gerdel [ 31/Mar/13 ] |
|
explain without the subquery |
| Comment by Marco Pivetta [ 31/Mar/13 ] |
|
Sergey Gerdel that's not the same query. |
| Comment by Marco Pivetta [ 31/Mar/13 ] |
|
Sergey Gerdel this is still using Using index; Using temporary; Using filesort Check your indexes |
| Comment by Sergey Gerdel [ 31/Mar/13 ] |
|
Not in the index problem SELECT DISTINCT id0 FROM (SELECT m0_.id AS id0, m0_.title AS title1, m0_.text AS text2, m0_.price AS price3, m0_.originalPrice AS originalPrice4, m0_.condition_type AS condition_type5, m0_.image_1 AS image_16, m0_.image_2 AS image_27, m0_.image_3 AS image_38, m0_.image_4 AS image_49, m0_.image_5 AS image_510, m0_.video AS video11, m0_.contact_email AS contact_email12, m0_.contact_name AS contact_name13, m0_.contact_phone AS contact_phone14, m0_.contact_type AS contact_type15, m0_.published AS published16, m0_.type AS type17, m0_.status AS status18, m0_.highlight AS highlight19, m0_.urgent AS urgent20, m0_.topads AS topads21, m0_.period AS period22, m0_.hits AS hits23, m0_.ip AS ip24, m0_.created_at AS created_at25, m0_.updated_at AS updated_at26 FROM milla_message m0_ WHERE m0_.status = 1 ORDER BY m0_.published DESC) dctrn_result LIMIT 20 OFFSET 0 Time: 104.614s explain 3 SELECT DISTINCT m0_.id AS id0 FROM milla_message m0_ WHERE m0_.status = 1 ORDER BY m0_.published DESC LIMIT 20 OFFSET 0; Time: 0.001s explain 4 |
| Comment by Marco Pivetta [ 01/Apr/13 ] |
|
Sergey Gerdel the ORM cannot simplify a complex query that way. There may be a conditional on one of the joined results, or generally usage of one of the joined results. Things that could be optimized here are:
The problem I see here is that the chance to spawn random bugs because of the optimization is very high, and you'd have to rewrite `walkSelectStatement` |
| Comment by Marco Pivetta [ 01/Apr/13 ] |
|
Marking as improvement |
| Comment by Sergey Gerdel [ 07/Apr/13 ] |
|
Minor? OK. Programmers may be mistaken in parser reality ORDER BY m0_.published DESC) dctrn_result LIMIT 20 OFFSET 0 |
| Comment by Marco Pivetta [ 07/Apr/13 ] |
|
Sergey Gerdel this problem does not introduce security issues and can be worked around by you while using your own pagination logic. It does not stop you from doing anything, that's why it's minor. |
| Comment by Sergey Gerdel [ 08/Apr/13 ] |
|
ok) |
[DDC-2347] Refresh Uniqueidentifier ID from mssql of inserted Entity in doctrine2.3 Created: 13/Mar/13 Updated: 13/Mar/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.3.2 |
| Fix Version/s: | None |
| Type: | Bug | Priority: | Minor |
| Reporter: | Lucas Senn | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | dql | ||
| Environment: |
Windows Server 2008 R2, Apache 2.2, Doctrine 2.3, PHP 5.4 |
||
| Description |
|
I don't want you to report something that isn't a bug. If it isn't a bug I'm very sorry for this issue report. Issue as reported in |
[DDC-2338] Entity with composite foreign keys identifiers should be persisted after related entities without exception Created: 07/Mar/13 Updated: 07/Mar/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | Git Master |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Alessandro Tagliapietra | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | orm, unitofwork | ||
| Environment: |
Mac OSX 10.8, php 5.4.11, doctrine git master version |
||
| Description |
|
I've seen that when you create an entity with a composite foreign key as identifier it cannot be flushed until the related entities are already flushed to the database and not just persisted. It would be nice to let the user flush all the entities together and just INSERT first the related entities to get the ID and then use that to INSERT the entity with composite foreign keys. I'm going to create a pull request with the failing test. |
| Comments |
| Comment by Alessandro Tagliapietra [ 07/Mar/13 ] |
|
Created pull request https://github.com/doctrine/doctrine2/pull/605 |
[DDC-2314] getResults with numeric indexes for fields Created: 22/Feb/13 Updated: 26/Feb/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Ninj | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
When executing a simple query with field names in SELECT clause, it is not possible to map field to numeric indexes. This is an example that i would imagine to be useful: SELECT c.id AS 0, c.name AS 1, l.text AS 2 FROM Category c LEFT JOIN c.label l Thus, the resulting results could be numeric indexed array. It is useful for many situations: when working with an API which expects such arrays, or when using list to assign result fields to variables directly. Query::HYDRATE_SCALAR does not achieve this, as one could think at first glance. |
[DDC-2308] Naming Strategy for Reverse Engeneering Created: 21/Feb/13 Updated: 21/Feb/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Mapping Drivers |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Andreas Prucha | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Unfortunately DatabaseDriver::getClassNameForTable() is declared as private method, which makes it quite difficult to change the naming strategy for reverse engeneering. IMO this sould be declared protected. An even better way would be to extend the interface of the Naming Strategy objects to support the reverse direction: classToTableName -> tableToClassName This way we would have a consistent name-mapping |
[DDC-2301] Support inheritance in ResultSetMappingBuilder Created: 16/Feb/13 Updated: 16/Feb/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | Git Master |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Ross Masters | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | nativesql, resultsetmapping | ||
| Description |
|
ResultSetMappingBuilder does not support inherited fields. For example, calling ResultSetMappingBuilder::addRootEntityFromClassMetadata($class, $alias) throws an exception to say this. I was wondering if there were any reasons as to why this would be difficult to implement? I haven't had an extensive look at Doctrine's source but it feels like this has been not implemented on purpose. Thanks |
[DDC-2288] Schema Tool doesn't update collation on table level Created: 08/Feb/13 Updated: 08/Feb/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Mapping Drivers, Tools |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Rickard Andersson | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | collation, schematool | ||
| Description |
|
In Symfony2, when updating the collation option of a table, the schema tool doesn't recognize the change: Changing from: * @ORM\Table() To:
* @ORM\Table(options={"collate"="utf8_swedish_ci"})
Results in: $ php app/console doctrine:schema:update --dump-sql Nothing to update - your database is already in sync with the current entity metadata. |
[DDC-2287] Getter/Setter: generate "isEnabled()" instead of "getEnabled()" for boolean field in entity classes Created: 08/Feb/13 Updated: 26/Feb/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Sukhrob Khakimov | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
It would be better if doctrine generated "isEnabled()" instead of "getEnabled()" for boolean field in entity classes. Because, it is more meaningful. |
| Comments |
| Comment by Marco Pivetta [ 08/Feb/13 ] |
|
Not sure this kind of check should be handled. Starting to add all this kind of rules makes me think that it is becoming a big ball of mud |
[DDC-2286] Update documentation for collation Created: 08/Feb/13 Updated: 08/Feb/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Rickard Andersson | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | collation, documentation | ||
| Description |
|
The documentation at http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/faq.html#how-do-i-set-the-charset-and-collation-for-mysql-tables clearly states that the collation should be set at database level and then inherited for all tables created. Digging through the code and reading this issue http://www.doctrine-project.org/jira/browse/DDC-2139 it's clear that this is no longer the case. |
[DDC-2283] Paginator with orderBy in joined data retrieve bad result Created: 07/Feb/13 Updated: 26/Feb/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.3.2 |
| Fix Version/s: | None |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Jean-Philippe THEVENOUX | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | paginator | ||
| Description |
|
entity A have many entity B If DQL is something like "select A, B from A join B order by A.field1, B.field2" so, if a entity A have 20 entity B (and these sub-entity have all a different b.field2) then there's only 1 A retrieved |
[DDC-2281] Validation against database-first generated xml requires that the column order within a composite primary key match the order the columns are in in mapping xml Created: 06/Feb/13 Updated: 09/May/13 |
|
| Status: | Awaiting Feedback |
| Project: | Doctrine 2 - ORM |
| Component/s: | Mapping Drivers |
| Affects Version/s: | 2.3.2 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Bug | Priority: | Minor |
| Reporter: | Aaron Moore | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
In using a database-first approach utilizing orm:convert-mapping to generate xml, the validation and schema-tool reports that my composite primary key (ex. Columns A, C, B) be dropped and added in the order in which the mapping appears in the xml (ex. Columns A, B, C). These columns are not auto-increment and are simply a mixture of int and varchar. |
| Comments |
| Comment by Benjamin Eberlei [ 09/May/13 ] |
|
Is the composite key a mix of association and field types? |
| Comment by Aaron Moore [ 09/May/13 ] |
|
I'm trying to remember the usage as it was a short term project but I believe it is. For example a user has a userid. The table in question might have a primary key consisting of the userid and an int representing a year.. |
[DDC-2260] Partial DQL query doesn't respect given order of columns Created: 26/Jan/13 Updated: 27/Jan/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | DQL |
| Affects Version/s: | 2.3.2 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Alexander Grimalovsky | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
When executing partial DQL queries it may be important to keep given order of columns e.g. for "pairs" hydrator when first column of a pair is used as a key and second - as value. For example query like this: select partial u.{id,name} from my:User u will expect "id" to be first in resulted set and "name" to be second and not vice versa. However Doctrine parses this part of statement via iterating over fields mapping from entity's class metadata (as can be seen in Doctrine\ORM\Query\SqlWalker::walkSelectExpression()): foreach ($class->fieldMappings as $fieldName => $mapping) {
if ($partialFieldSet && ! in_array($fieldName, $partialFieldSet)) {
continue;
}
...
and hence given columns order preserving is not guaranteed. |
| Comments |
| Comment by Marco Pivetta [ 26/Jan/13 ] |
|
What is the advantage in respecting the order given in the DQL query? |
| Comment by Alexander Grimalovsky [ 27/Jan/13 ] |
|
Currently the only practical reason for it that I found is "pairs" hydrator. However it is, of course, possible to implement it without such change too. Generally speaking this behavior (getting result set with same order of columns that was given in a query) is something that is feeling "natural" for operations with database since it is how you normally get results from SQL queries. Maybe it will be enough to mention in documentation for Doctrine that given columns order is not guaranteed to be kept. |
| Comment by Marco Pivetta [ 27/Jan/13 ] |
|
@Alexander Grimalovsky I don't think it's worth mentioning it. Also, including a fix for this is quite complex. If you prefer to document it, go for it! |
[DDC-2236] SUM(..) with Pagination gives incorrect result Created: 11/Jan/13 Updated: 10/Feb/13 |
|
| Status: | In Progress |
| Project: | Doctrine 2 - ORM |
| Component/s: | Tools |
| Affects Version/s: | 2.2.3 |
| Fix Version/s: | None |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Oleg | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | paginator | ||
| Environment: |
Linux |
||
| Description |
|
https://github.com/whiteoctober/Pagerfanta/issues/69 <?php $pager = new Pagerfanta(new DoctrineORMAdapter($query)); $result = $pager->getCurrentPageResults(); $result = $query->getQuery()->getResult(); Sql for the above: SELECT DISTINCT id0 FROM (SELECT q0_.id AS id0, SUM(q0_.price) AS sclr36 FROM Q q0_ WHERE q0_.id IN (19, 20, 22) GROUP BY q0_.customer_id) dctrn_result LIMIT 30 OFFSET 0 Sql with fetchJoin = false (new DoctrineORMAdapter($query, false)) SELECT q0_.id AS id0, SUM(q0_.price) AS sclr36 FROM Quote q0_ WHERE q0_.id IN (19, 20, 22) GROUP BY q0_.customer_id LIMIT 30 OFFSET 0 |
| Comments |
| Comment by Alexander [ 09/Feb/13 ] |
|
Can you also test this with doctrine >= 2.3? The pagination code changed quite a lot. |
| Comment by Oleg [ 10/Feb/13 ] |
|
Looks like no change composer.json:
then cleared cache but result is same
$query = $this->getDoctrine()->getEntityManager()->getRepository('MyBundle:Invoice')
->createQueryBuilder('q')
->select('q', 'SUM(q.amount) AS amount')
->groupBy('q.customer')
;
95 Connect root@localhost on ** 95 Query SELECT DISTINCT id0 FROM (SELECT i0_.id AS id0, i0_.invoice_num AS invoice_num1, i0_.date AS date2, i0_.amount AS amount3, i0_.vat_amount AS vat_amount4, i0_.amount_paid AS amount_paid5, i0_.md5 AS md56, i0_.is_exported AS is_exported7, i0_.created AS created8, SUM(i0_.amount) AS sclr9 FROM Invoice i0_ GROUP BY i0_.customer_id) dctrn_result LIMIT 30 OFFSET 0 95 Query SELECT i0_.id AS id0, i0_.invoice_num AS invoice_num1, i0_.date AS date2, i0_.amount AS amount3, i0_.vat_amount AS vat_amount4, i0_.amount_paid AS amount_paid5, i0_.md5 AS md56, i0_.is_exported AS is_exported7, i0_.created AS created8, SUM(i0_.amount) AS sclr9, i0_.customer_id AS customer_id10 FROM Invoice i0_ WHERE i0_.id IN ('2') GROUP BY i0_.customer_id 95 Query SELECT i0_.id AS id0, i0_.invoice_num AS invoice_num1, i0_.date AS date2, i0_.amount AS amount3, i0_.vat_amount AS vat_amount4, i0_.amount_paid AS amount_paid5, i0_.md5 AS md56, i0_.is_exported AS is_exported7, i0_.created AS created8, SUM(i0_.amount) AS sclr9, i0_.customer_id AS customer_id10 FROM Invoice i0_ GROUP BY i0_.customer_id 130210 16:08:25 95 Quit But I understand why that happens, it's due to group by and pagination nature. If I do $pager = new Pagerfanta(new DoctrineORMAdapter($query, false)); I get this sql SELECT i0_.id AS id0, i0_.invoice_num AS invoice_num1, i0_.date AS date2, i0_.amount AS amount3, i0_.vat_amount AS vat_amount4, i0_.amount_paid AS amount_paid5, i0_.md5 AS md56, i0_.is_exported AS is_exported7, i0_.created AS created8, SUM(i0_.amount) AS sclr9, i0_.customer_id AS customer_id10 FROM Invoice i0_ LIMIT 30 OFFSET 0 I think it should be noted somewhere that if you do groupBy you should set fetchJoin to false? |
| Comment by Marco Pivetta [ 10/Feb/13 ] |
|
Updating to Documentation issue. |
[DDC-2227] Add details about developer being responsible of inverse side of an association Created: 09/Jan/13 Updated: 09/Jan/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation, ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Marco Pivetta | Assignee: | Marco Pivetta |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
As far as I know, docs don't explain that it is up to the developer to keep the object graph consistent instead of relying on Doctrine ORM for everything. For example, for many to many, examples like following may be used: |
[DDC-2203] add EntityManager->getFilters()->isEnabled('filterName'') Created: 17/Dec/12 Updated: 01/Apr/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | Git Master |
| Fix Version/s: | 2.4 |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Enea Bette | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Comments |
| Comment by Paweł Nowak [ 10/Jan/13 ] |
|
My pull request (https://github.com/doctrine/doctrine2/pull/548) contains an implementation of the method. Note that no exception is thrown if you query for the state of a non-existing filter - in such a case, false is returned as for disabled filters. |
[DDC-2200] Duplicates returned while accessing associations from @PostPersist callback Created: 15/Dec/12 Updated: 15/Dec/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.3.1 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Bug | Priority: | Minor |
| Reporter: | Brent | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
When creating a new Post and adding it to a collection in an existing Thread (i.e. loaded from the database), referencing Thread's posts collection in Post's @PostPersist callback returns the Post twice. To clarify, this only happens when Thread was previously persisted. If I'm creating a new Thread object the code works as expected. I've included some sample code to better illustrate my issue. I don't know if this is a bug, or if I'm doing something that I shouldn't be, but I couldn't find this limitation mentioned in the documentation, and this seems to go against the expected behavior. Here are my sample entities: /** * @Entity * @Table(name="thread") */ class Thread { /** * @Id * @GeneratedValue * @Column(type="integer") */ protected $id; /** * @OneToMany(targetEntity="Post", mappedBy="thread", cascade={"persist", "remove"}) */ protected $posts; public function __construct() { $this->posts = new ArrayCollection(); } public function getPosts() { return $this->posts->toArray(); } public function addPost(Post $post) { $post->setThread($this); $this->posts->add($post); } } /** * @Entity * @Table(name="post") * @HasLifecycleCallbacks */ class Post { /** * @Id * @GeneratedValue * @Column(type="integer") */ protected $id; /** * @ManyToOne(targetEntity="Thread", inversedBy="posts") * @JoinColumn(name="thread_id", referencedColumnName="id") */ protected $thread; public function getId() { return $this->id; } /** * @PostPersist */ public function onPostPersist() { $posts = $this->thread->getPosts(); foreach ($posts as $post) { echo 'id: ' . $post->getId() . ' type: ' . get_class($alert) . '<br />'; } } public function setThread(Thread $thread) { $this->thread = $thread; } } And the calling code: // Grab an existing thread. $thread = $em->getReference('Thread', 1); $thread->addPost(new Post()); $em->flush(); This outputs: id: 1 type: Post id: 1 type: Post Alternatively: // Create a new thread. $thread = new Thread() $thread->addPost(new Post()); $em->persist($thread); $em->flush(); This outputs: id: 1 type: Post |
[DDC-2164] Extend the cache support to eAccelerator Created: 23/Nov/12 Updated: 26/Nov/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.4, 3.0 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Enea Bette | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | cache, drivers | ||
| Description |
|
It would be nice if the Doctrine caching drivers would support the eAccelerator library. |
| Comments |
| Comment by Marco Pivetta [ 23/Nov/12 ] |
|
Enea Bette eAccelerator is known for being stripping comments from cached source (making it impossible to use annotations)... Do you happen to know if this is fixed? Supporting it as cache driver is fine btw, I just wonder how many users will start thinking of using eAccelerator and then will be facing this huge limitation. |
| Comment by Enea Bette [ 26/Nov/12 ] |
|
I know that eAccelerator has this issue. It would be nice if we could utilize it with XML, YML and PHP based mapping though. To give response to your question (eAccelerator and annotations incompatibility), there is a pull request on github, https://github.com/eaccelerator/eaccelerator/issues/19 . It seems that in the future these could be resolved, and at that time it would be very nice to have that supported with doctrine (symfony2 already has support for this library). "I just wonder how many users will start thinking of using eAccelerator and then will be facing this huge limitation". Sometimes users just does not have a choice. Imagine the case when you have a hosted site that requires caching functionalities and the only available cache library is eAccelerator (as just in my case). You would be fried as a chicken hehe |
[DDC-2140] [GH-512] Added addParameters() to Query and QueryBuilder Created: 13/Nov/12 Updated: 20/Nov/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.3, Git Master |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Benjamin Eberlei | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | Query,, QueryBuilder | ||
| Environment: |
OS X 10.8.2, PHP 5.3.18, Nginx 1.2.4 (php through FPM) |
||
| Description |
|
This issue is created automatically through a Github pull request on behalf of jappie: Url: https://github.com/doctrine/doctrine2/pull/512 Message: This method behaves like setParameters() before version 2.3: It can take a Doctrine\Common\Collections\ArrayCollection with Doctrine\ORM\Query\Parameter objects, as well as a plain array with key/value pairs, as argument. This will greatly ease the upgrade to Doctrine 2.3, because you only need to perform a project-wide replace of setParameters with addParameters, in stead of going into your code and determine if calls to setParameters are ok or need refactoring. I've also added unit-tests to maintain integrity. |
| Comments |
| Comment by Benjamin Eberlei [ 20/Nov/12 ] |
|
A related Github Pull-Request [GH-512] was closed |
| Comment by Jasper N. Brouwer [ 20/Nov/12 ] |
Hi Guilherme, I agree that such a method makes less sense in Query, because when you write a DQL string all parameters are known at once. But when using the QueryBuilder you might need different parameters in different cases, so addParameters() becomes useful there. I guess it's just a convenience method, like IMHO setParameter() is. (You could just do $qb->getParameters()->add()) The main reason for adding the method was, like I said, upgrading to Doctrine 2.3. I've already upgraded all my projects to Doctrine 2.3, so the method is less useful for me now. But it took me a full day to refactor my repositories, because there is no safe way to automate the process. A simple search-and-replace setParameters() to addParameters() would have taken me 5 minutes I'm content with your decision. |
[DDC-2134] Add referential integrity check for MySQL to console commands Created: 09/Nov/12 Updated: 09/Nov/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Menno Holtkamp | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
MySQL |
||
| Description |
|
Today I spent some time solving a PHP 'White Screen of Death'. I traced it back to a Entity of which the proxy's __load() function was invoked because af a EXTRA_LAZY association. Due to incorrect database contents (the entry ID was changed due to an update: referential integrity broke), the __load() query resulted in no results. The EntityNotFoundException did for some reason not show up in our logs, probably because the lazy load was triggered by a magic __toString() function. The cause is because of the way we populate or tables with domain data: SET FOREIGN_KEY_CHECKS = 0; #IMPORT STUFF from CSV SET FOREIGN_KEY_CHECKS = 1; MySQL does not trigger any errors when the foreign key checks are turned back on, leaving the table in an inconsistent state. To prevent this, I found some information in this post: http://www.mysqlperformanceblog.com/2011/11/18/eventual-consistency-in-mysql/, which I used to come with the following queries #Check the constraints of a specific database SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = 'databaseName' AND REFERENCED_TABLE_NAME IS NOT NULL
#Generate table specific queries to find orphaned entries
SELECT CONCAT(
'SELECT ', GROUP_CONCAT(DISTINCT CONCAT(K.CONSTRAINT_NAME, '.', P.COLUMN_NAME,
' AS `', P.TABLE_SCHEMA, '.', P.TABLE_NAME, '.', P.COLUMN_NAME, '`') ORDER BY P.ORDINAL_POSITION), ' ',
'FROM ', K.TABLE_SCHEMA, '.', K.TABLE_NAME, ' AS ', K.CONSTRAINT_NAME, ' ',
'LEFT OUTER JOIN ', K.REFERENCED_TABLE_SCHEMA, '.', K.REFERENCED_TABLE_NAME, ' AS ', K.REFERENCED_TABLE_NAME, ' ',
' ON (', GROUP_CONCAT(CONCAT(K.CONSTRAINT_NAME, '.', K.COLUMN_NAME) ORDER BY K.ORDINAL_POSITION),
') = (', GROUP_CONCAT(CONCAT(K.REFERENCED_TABLE_NAME, '.', K.REFERENCED_COLUMN_NAME) ORDER BY K.ORDINAL_POSITION), ') ',
'WHERE ', K.REFERENCED_TABLE_NAME, '.', K.REFERENCED_COLUMN_NAME, ' IS NULL;'
)
INTO OUTFILE '/tmp/verifyDatabaseTableIntegrity.sql'
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE K
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE P
ON (K.TABLE_SCHEMA, K.TABLE_NAME) = (P.TABLE_SCHEMA, P.TABLE_NAME)
AND P.CONSTRAINT_NAME = 'PRIMARY'
WHERE K.TABLE_SCHEMA = 'databaseName'
AND K.REFERENCED_TABLE_NAME IS NOT NULL
GROUP BY K.CONSTRAINT_NAME;
By running the generated queries, we can now easily find the records that break referential integrity. It might be an idea of adding this functionality to the orm:validate-schema, or a new orm:validate-database-integrity? |
[DDC-2103] Add support for using AliasResultVariable in WhereClause Created: 25/Oct/12 Updated: 25/Oct/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Martin Hasoň | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
It would be nice if supported writing in DQL: SELECT LOWER(a.name) AS name FROM User a WHERE name LIKE ? The resulting sql: SELECT LOWER(c0_.name) AS sclr0 FROM users c0_ WHERE LOWER(c0_.name) LIKE ? |
[DDC-2076] Optimization for MEMBER OF Created: 14/Oct/12 Updated: 14/Oct/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | DQL |
| Affects Version/s: | Git Master |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Christophe Coevoet | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | dql | ||
| Description |
|
Currently, using MEMBER OF for a ManyToMany collection does a join on the table of the related entity, whereas all it needs is in the join table. Using the following DQL: SELECT p FROM Player p WHERE NOT :team MEMBER OF p.targetedBy Here is the current generated SQL: WHERE NOT EXISTS (SELECT 1 FROM player_team p1_ INNER JOIN Team t2_ ON p1_.team_id = t2_.id WHERE p1_.player_id = p0_.id AND t2_.id = ?) whereas it could drop the join: WHERE NOT EXISTS (SELECT 1 FROM player_team p1_ WHERE p1_.player_id = p0_.id AND p1_.team_id = ?) |
[DDC-2053] [GH-460] added support to extend strategies for IdGenerators Created: 02/Oct/12 Updated: 03/Oct/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Mapping Drivers |
| Affects Version/s: | Git Master |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Benjamin Eberlei | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
This issue is created automatically through a Github pull request on behalf of Powerhamster: Url: https://github.com/doctrine/doctrine2/pull/460 Message: Mapping drivers now use extended classmetadata class to find constants of generator types. |
| Comments |
| Comment by Benjamin Eberlei [ 03/Oct/12 ] |
|
A related Github Pull-Request [GH-460] was closed |
[DDC-2035] XML Mapping : add attribute "length" for tag "id" Created: 20/Sep/12 Updated: 29/Sep/12 |
|
| Status: | Awaiting Feedback |
| Project: | Doctrine 2 - ORM |
| Component/s: | Mapping Drivers |
| Affects Version/s: | 2.2.3 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Erik Müller | Assignee: | Fabio B. Silva |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Linux, Doctrine ORM 2.3.0, MySQL |
||
| Description |
|
XML mapping : <id name="id" type="string" length="16"/> Generate SQL : id varchar(255) not null
It's not possible with XML mapping to have : id varchar(16) not null
Because tag "id" doesn't support "length" attribute. |
| Comments |
| Comment by Fabio B. Silva [ 20/Sep/12 ] |
|
Hi Erik, The atribute "id" arealdy support "length" in the current doctrine version Which version are you using ? |
[DDC-2030] better way to detect class parents Created: 13/Sep/12 Updated: 13/Sep/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Mapping Drivers |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Asmir Mustafic | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Hi! I'm trying to detect some inheritance cases, but there is a problem. Doctrine always uses PHP class inheritance to detect entity hierarchy, but generating entities starting from database, i have not yet any php class. There is a better way to detect entities hierarchy? Without php classes... The practical case is: Even if i manualy create XML mapping files, and then i try to generate php entityes. There is the same problem. XmlDriver tries to call setDiscriminatorMap method that raises the same exception. |
[DDC-1993] New method required: ClassMetadataInfo::isAssociationNullable() Created: 22/Aug/12 Updated: 22/Aug/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Mapping Drivers, ORM |
| Affects Version/s: | 2.2 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | gregoire_m | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Hi, I'm working with Symfony 2.1, and I need to know if an association is nullable for a given entity (to know if a form field should be marked as 'required'). So I'd like to have a isAssociationNullable() method in the ClassMetadataInfo class, that should do the same thing that the isNullable() method does for fields. You can see more information about the problem on the Symfony issue. Thanks. |
[DDC-1988] Add Any and ManyToAny annotations Created: 18/Aug/12 Updated: 18/Aug/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Stefano Rodriguez | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
It would be really nice to have @Any and @ManyToAny relations/annotations implemented like on Hibernate. |
[DDC-1983] Incorrect use statement in 25.1.3. Configuration example (Doctrine Console) Created: 15/Aug/12 Updated: 15/Aug/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Atli Thor Jonsson | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | Cli, documentation | ||
| Description |
|
The code example here: In the second "use" statement it references a "EntityManagerHelper" from the "Doctrine\DBAL\Tools\Console\Helper\" package. However, it does not exist there. It does exist in the "Doctrine\ORM\Tools\Console\Helper\" package though, and replacing it seems to work. |
[DDC-1952] Add support for array parameters on the SQLFilter Created: 27/Jul/12 Updated: 27/Jul/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | Git Master |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Menno Holtkamp | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Description |
|
The SQLFilter currently only accepts string parameters which would result in SQL like: "tableAlias.column = '$filterParameter'" To filter an Entity that has a lifecycle, this can be usefull to filter Entities that are in a specific state, for example: "tableAlias.state = 1" To be able to apply the filter on an Entity that can be in multiple states, it is usefull to be able to assign an array of states using setParameter: $allowedStates = array(1,2,3,4);
$filter->setParameter('allowedStatesParam', $allowedStates);
sprintf("tableAlias.state IN (%s)", implode(',', $this->getParameter('allowedStatesParam')));
to eventually result in: "tableAlias.state IN (1,2,3,4)" However, this is currently not supported, it seems to go wrong on the PDO::quote() of the parameter. The SQL works ok when setting it statically in the filter, not taking the parameter into account. It would be nice to have support for arrays on the setParameter() |
[DDC-1950] Useful exception when combining Column with ManyToOne Created: 26/Jul/12 Updated: 26/Jul/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Igor Wiedler | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
When applying both @Column and @ManyToOne annotations to a field, it blows up with crazy internal errors. It would be great if this case – and similar cases – could throw a nice exception which tells the user what he did wrong. |
[DDC-1921] Clarify Identifier definition for CTI entities Created: 11/Jul/12 Updated: 11/Jul/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Ludek Stepan | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Hello, Reference Guide topic 4.8 Identifers/Primary Keys(http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#identifiers-primary-keys) states that: "Every entity class needs an identifier/primary key." However, example in topic 7.3. Class Table Inheritance (http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/inheritance-mapping.html#class-table-inheritance) doesn't contain any definitions for Ids. Consider following code: /** * @Entity * @InheritanceType("JOINED") * @DiscriminatorColumn(name="discr", type="string") * @DiscriminatorMap({"person" = "Person", "employee" = "Employee"}) */ class Person { /** @Id @Column(type="integer") */ private $id; public function getId() { return $this->id; } } /** @Entity */ class Employee extends Person { /** @Id @Column(type="integer") */ private $id; // Overrides parent to retrieve private public function getId() { return $this->id; } } // create instances and $em->persist(...) // $person instanceof Person $person->getId(); // Returns id. // $employee instanceof Employee $employee->getId(); // Returns null. Private $id in subclass isn't assigned. Please clarify correct use of identifiers in CTI subclass entities. Should subclasses contain any definitions of identifiers? Thank you! Ludek |
[DDC-1916] Centralize the Cache mechanism simplifying the query creation Created: 09/Jul/12 Updated: 09/Jul/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | DQL, ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | New Feature | Priority: | Minor |
| Reporter: | liuggio | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Hi all, in a big project if you have queries spread out in different the idea: see the code for a better explanation the pro: a better handling of the cache mechanism Do you think is a good approach? Thanks liuggio |
[DDC-1889] generate persisters Created: 21/Jun/12 Updated: 22/Oct/12 |
|
| Status: | In Progress |
| Project: | Doctrine 2 - ORM |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Fabio B. Silva | Assignee: | Fabio B. Silva |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
I'm not sure if this is really possible.. but to improve performance we should consider generate custom entity persisters. Now entity persister are not cached, |
| Comments |
| Comment by Benjamin Eberlei [ 21/Jun/12 ] |
|
This should be relatively easy in the first step by ust generate the RSM and SQL statements in the constructor and extending from the default persister. |
[DDC-1888] generate hydrators Created: 21/Jun/12 Updated: 21/Jun/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Fabio B. Silva | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
To improve performance we should consider generate custom hydrators per entity or per rsm. I think that will create a huge performance improvement, avoiding checks every time that an entity/result is hydrated. |
[DDC-1847] Do not check for type equality in scalars when computing changeset? Created: 30/May/12 Updated: 08/Jun/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Albert Casademont | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Decimal type in mysql converts as a string in php. This is great as Decimal has a much higher precision than a float or double and that precision would be lost if converted to a float in PHP. Fine! But when doing calculations (as my numbers do not require an enormous precision gmp_ functions are not necessary) php converts these strings into floats. Then, when computing the changeset, as the value is compared with === is marked as a change even though there is none ("5.00" string vs 5.00 float) and an UPDATE for that row is made. Would it be possible to check only for simple equality "==" instead of type equality "===" when dealing with scalar types? Another example of this would be the boolean type, that it is stored as an integer 1 in mysql but converted to a boolean true in php. If during the execution of my code that boolean gets converted to an integer 1, that will trigger an UPDATE also because 1 !== true. Should this be my responsability or doctrine should be a little more flexible regarding comparisons? Thanks!! |
| Comments |
| Comment by Marco Pivetta [ 08/Jun/12 ] |
|
Hi there! |
| Comment by Albert Casademont [ 08/Jun/12 ] |
|
Hi marco! Actually i am using DECIMAL (or NUMERIC), not FLOAT, That type is not casted as it would lose precision. Therefore, my problem is when working with DECIMAL (Which is, btw, the type that mysql recommends for storing money values) |
| Comment by Marco Pivetta [ 08/Jun/12 ] |
|
Unsure if the cast should happen in the type (just ignorant about the implication in precision), but I'll suggest it then. |
| Comment by Albert Casademont [ 08/Jun/12 ] |
|
It should not happen as the DECIMAL type in MySQL has much more precision than a double or float in PHP. It was previously cast but there was an issue regarding this cast and the cast was deleted http://www.doctrine-project.org/jira/browse/DBAL-121 After that, in another issue a user points out the same problem i am facing, that i have to cast back to string if i do not want doctrine to issue an UPDATE command for values that have not changed http://www.doctrine-project.org/jira/browse/DBAL-180 As i said, my only point is that maybe, when computing the changeset, the comparison for scalar types should be more relaxed with a == instead of a === |
| Comment by Marco Pivetta [ 08/Jun/12 ] |
|
Don't think this can be done, as you don't really know what types (and so also the conversion rules) the user applies to his own model. I wouldn't do that, leaving the implementor of the entities to have strict checks on types during operations in setters... |
[DDC-1825] generate entities with traits Created: 18/May/12 Updated: 09/Feb/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.2.2 |
| Fix Version/s: | None |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Matthias Breddin | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Environment: |
php 5.4.3, symfony2.1-dev |
||
| Description |
|
When a trait with included setters and getters is used and generate entities is called, doctrine add another set of getters and setters to the "main" entity where the trait is used. |
[DDC-1819] Allow ResultSetMapping to be used for objects that are not entities Created: 11/May/12 Updated: 14/May/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.3 |
| Fix Version/s: | None |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Marijn Huizendveld | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Currently Doctrine\ORM\Query\ResultSetMapping can only be used to query the database for entities using the EntityManager::createNativeQuery method. It would be great if we could use this as well for objects that are not entities. That way we can create simple DTO's and map them to a query using the ResultSetMapping. I'll open a PR If there are no objections. |
| Comments |
| Comment by Benjamin Eberlei [ 11/May/12 ] |
|
Good idea. You could make this happen by adding a ArbitraryObjectHydrator that does not use the ClassMetadata but creates ReflectionProperty instances during the hydration. Api would then be: $rsm = new ResultSetMapping();
....
$query = $em->createNativeQuery($sql, $rsm);
$objects = $query->getResult(Query::HYDRATOR_ARBITRARY_OBJECTS);
|
| Comment by Marijn Huizendveld [ 13/May/12 ] |
|
Thanks for your input. I'll try to work on some tests this week. |
| Comment by Marijn Huizendveld [ 14/May/12 ] |
[DDC-1754] Allow use of Foregin Keys in DQL LIKE condition Created: 03/Apr/12 Updated: 09/Apr/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | DQL |
| Affects Version/s: | 2.2.1 |
| Fix Version/s: | None |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Tim Roediger | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Php 5.3 |
||
| Description |
|
When using a LIKE condition in a WHERE clause, I would like to be able to use the foreign key of a single value association. For example: Imagine Product and Department are both entities. Department has the field Name with a unique index. Product is has a ManyToOne association called Department with the Department entity, referencing the field Name. I would like to write: However, at present I need to write: The issue is one of performance. On large record sets the first query runs several magnatudes more quickly than the second, particularly when four or five joins are involved. Looking at the DQL grammar from the online docs, the relveant lines are: LikeExpression ::= StringExpression ["NOT"] "LIKE" string ["ESCAPE" char] The problem is the StateFieldPathExpression in StringPrimary. When used with a LikeExpression a SingleValuedAssociationField should be allowed also. |
| Comments |
| Comment by Benjamin Eberlei [ 07/Apr/12 ] |
|
This would only work if Department#Name is the primary key. Is it? DQL is not about optimized performance in very single edge case. We need to keep some parts open to keep the code simple. This is at best a feature request, not a bug. |
| Comment by Tim Roediger [ 09/Apr/12 ] |
|
Thanks for your reply Benjamin, I agree with your assesment that this is more accurately an improvement request than a bug. My appologies it was placed in the wrong category. No, Department#Name is not the primary key, but it does have a unique index. I've worked a little more to understand the DQL grammar. It appears that only one small, simple change is required: FROM: TO: This would improve consistancy with other aspects of DQL. For example, AggregateExpression COUNT, NullComparisonExpression , GroupByItem, and ArithmeticPrimary all allow a SingleValuedPathExpression rather than the more strict StateFieldPathExpression. Bascially my frustration is that as DQL currently stands, foregin keys which are already existant in a db table cannot be used in a LIKE expression without doing an unnessessary JOIN. Foreign keys can already be used in DQL for BETWEEN, IS NULL and comparison expressions, so why not LIKE expressions also? It appears the only thing holding this back is an unrequired restriction in the DQL grammar. Cheers, Tim |
[DDC-1716] Better unique constraints handling or even updateIfExists/findOneOrCreate Created: 19/Mar/12 Updated: 19/Apr/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.2.1 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Konstantin | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 5 |
| Labels: | None | ||
| Description |
|
It is too hard handle rows duplication now. As adviced here http://stackoverflow.com/questions/3967226/checking-for-duplicate-keys-with-doctrine-2 we should catch \PDOException with code 23000. This is bad behavior. So I propose: |
| Comments |
| Comment by Mark van der Velden [ 19/Apr/12 ] |
|
I don't think it should be limited to the flush method, however, as this can occur with "custom" queries also. It would be ideal if the errors being generated can be much more easily (read: standardized) caught or read. I'm in favor of letting the database handle integrity checks, and not run a query to decide wether or not the update or insert queries will violate. Hence the desire to handle this more gracefully. |
| Comment by Lucas van Lierop [ 19/Apr/12 ] |
|
The DBAL statement class (https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Statement.php) has and execute method which might be a good place to catch and convert the generic PDOExceptions by wrapping the line $stmt = $this->stmt->execute($params); in a try/catch statement which then calls some kind of PDOException to Doctrine Exception method |
[DDC-1675] PDO::FETCH_GROUP Created: 01/Mar/12 Updated: 01/Mar/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | DQL, ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Henrik Bjornskov | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
PDO supports grouping by a field when doing a fetchAll() by using PDO::FETCH_GROUP. This can in many places be useful. http://blog.stealth35.com/2011/08/17/pdo-fetch-group.html desribes the behavior quite well. |
[DDC-1630] Get PersistentCollection::getDeleteDiff is empty when collection changes from 1 item to zero items Created: 31/Jan/12 Updated: 09/Feb/13 |
|
| Status: | Awaiting Feedback |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Bug | Priority: | Minor |
| Reporter: | Lee | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 2 |
| Labels: | None | ||
| Environment: |
Symfony2 |
||
| Attachments: |
|
| Comments |
| Comment by Steve Müller [ 09/Feb/12 ] |
|
Same problem here. I wanted to write some unit tests, checking the entity relations and ran into exactly the same problem. Maybe my code can provide some more information (Group entity is the owning side, role entity is the inverse side): WHAT DOES NOT WORK: /**
* Test ArrayCollection
*/
$group = new Group('Group Test');
$em->persist($group);
$em->flush();
$groups = new ArrayCollection();
$groups->add($group);
$this->role->setGroups($groups);
$this->assertEquals($groups, $this->role->getGroups());
/**
* Test PersistentCollection
*/
$em->persist($this->role);
$em->flush();
$groups = $this->role->getGroups();
$groups->removeElement($group); // first remove element before adding a new one
$group = new Group('Group Test 2');
$em->persist($group);
$em->flush();
$groups->add($group);
$this->role->setGroups($groups);
$this->assertEquals($groups, $this->role->getGroups());
WHAT WORKS: /**
* Test ArrayCollection
*/
$group = new Group('Group Test');
$em->persist($group);
$em->flush();
$groups = new ArrayCollection();
$groups->add($group);
$this->role->setGroups($groups);
$this->assertEquals($groups, $this->role->getGroups());
/**
* Test PersistentCollection
*/
$em->persist($this->role);
$em->flush();
$groups = $this->role->getGroups();
$group2 = new Group('Group Test 2');
$em->persist($group2);
$em->flush();
$groups->add($group2); // first adding a new element before removing one
$groups->removeElement($group);
$this->role->setGroups($groups);
$this->assertEquals($groups, $this->role->getGroups());
Hope this helps in any way... I tried figuring it out on my own but I am too drunk right now xD |
| Comment by Benjamin Eberlei [ 10/Feb/12 ] |
|
Thanks for the report, formatted it |
| Comment by Benjamin Eberlei [ 10/Feb/12 ] |
|
Which version is that btw? |
| Comment by Steve Müller [ 16/Feb/12 ] |
|
Occurs in version 2.1.6 |
| Comment by Benjamin Eberlei [ 20/Feb/12 ] |
|
If group is the owning side, why do you only set Role::$groups? This has to be the other way around or not? |
| Comment by Benjamin Eberlei [ 20/Feb/12 ] |
|
@Steve I cannot reproduce your issue. Attached is a test script. Your code is very weird btw, why are you getting and setting groups collection? It is passed by reference so you can just have something like $role->addGroup() and $role->removeGroup() and encapsulate the logic? Also your tests are pretty useless, you check if two variables which are the same reference to the same collection are the same. Which should always be true. @Lee Can you provide more details? I cant verify this without more details. |
| Comment by Alexander [ 09/Feb/13 ] |
|
Can anyone provide us with more feedback? |
[DDC-1555] Reference. 8 Work. with obj. Making "see "Transitive Persistence"" as link Created: 22/Dec/11 Updated: 22/Dec/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation |
| Affects Version/s: | 2.1, 2.1.1, 2.1.2, 2.1.3, 2.1.4, 2.1.5 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Yaroslav Kiliba | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
8. Working with Objects: |
[DDC-1518] Method chaining in Setters of generated entity classes Created: 02/Dec/11 Updated: 02/Dec/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Tools |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Christian Stoller | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Symfony2 |
||
| Description |
|
Hi. $user = new User();
$user->setUsername()
->setFirstname()
->setEmail();
In PHP 5.4 we can do even more nicer: $user = new User()
->setUsername()
->setFirstname()
->setEmail();
If this is not wanted by everyone, the console tool could get a new argument to define if method chaining should be used or not. Implementation of this improvement would be very nice. Thanks. |
[DDC-1511] Suggestion on the docs for batch processing Created: 25/Nov/11 Updated: 25/Nov/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation |
| Affects Version/s: | 2.0 |
| Fix Version/s: | None |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Jamie Wong | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
br0wser |
||
| Description |
|
I am refering to the examples on http://www.doctrine-project.org/docs/orm/2.0/en/reference/batch-processing.html Let's say you want to process a bulk of 25 objects and have a batchsize of 20. This is probably very clear to any experienced Doctrine developer but maybe it is also confusing for beginners like me (some internet sources say, that flush is executed automatically at the end of the request, but obviously it is not). Maybe this could be mentioned somewhere? |
[DDC-1494] Query results are overwritten by previous query. Created: 15/Nov/11 Updated: 09/Feb/13 |
|
| Status: | Awaiting Feedback |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.1.2 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Bug | Priority: | Minor |
| Reporter: | J | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
PHP 5.3 + MySQL 5.5 |
||
| Attachments: |
|
| Description |
|
I am running a query that JOINs three tables, with a simple WHERE: $q = $em->createQuery("
SELECT cat, n, c
FROM Project_Model_NoticeCategory cat
JOIN cat.notices n
JOIN n.chapters c
WHERE
c.id = :chapter_id
");
When I do this: $q->setParameter('chapter_id', 1);
$a = $q->getResult();
$q->setParameter('chapter_id', 2);
$b = $q->getResult();
$b always has the wrong results. Running the following code: $q->setParameter('chapter_id', 1);
$a = $q->getResult();
$q->setParameter('chapter_id', 2);
$b = $q->getResult();
$z = $q->getArrayResult();
BUG Results: $b != $z (getArrayResult IS CORRECT, it refreshes the results) Note: $a==$b (which is wrong) Explanation: There is a chapter table, this has a many-to-many join to notices (these are meta info Data model: /** * @Entity * @Table(name="chapter") */ class Project_Model_Chapter { /** * @Id @Column(type="integer") * @GeneratedValue(strategy="AUTO") */ private $id; /** @Column(type="string") */ private $title; /** * @ManyToMany(targetEntity="Project_Model_Notice", mappedBy="chapters") */ private $notices; .... /lots of code snipped/ .... } /** * @Entity * @Table(name="notice") */ class Project_Model_Notice { /** * @Id @Column(type="integer") * @GeneratedValue(strategy="AUTO") */ private $id; /** @Column(type="string") */ private $title; /** * @ManyToMany(targetEntity="Project_Model_Chapter", inversedBy="notices") * @JoinTable(name="chapter_notice") */ private $chapters; /** * @ManyToOne(targetEntity="Project_Model_NoticeCategory", inversedBy="notices") */ private $notice_category; .... /lots of code snipped/ .... } /** * @Entity * @Table(name="notice_category") */ class Project_Model_NoticeCategory { /** * @Id @Column(type="integer") * @GeneratedValue(strategy="AUTO") */ private $id; /** @Column(type="string") */ private $title; /** * Bidirectional - One-To-Many (INVERSE SIDE) * * @OneToMany(targetEntity="Project_Model_Notice", mappedBy="notice_category", cascade={"persist", "remove"}) */ private $notices; .... /lots of code snipped/ .... } Data fixtures: $tools = new \Project_Model_NoticeCategory; $tools->setTitle('Tools'); $spanner = new \Project_Model_Notice; $spanner->setTitle('spanner'); $tools->addNotice($spanner); $drill = new \Project_Model_Notice; $drill->setTitle('power drill'); $tools->addNotice($drill); $this->em->persist($tools); $this->em->flush(); $tools = new \Project_Model_NoticeCategory; $tools->setTitle('Safety'); $gloves = new \Project_Model_Notice; $gloves->setTitle('gloves'); $tools->addNotice($gloves); $goggles = new \Project_Model_Notice; $goggles->setTitle('goggles'); $tools->addNotice($goggles); $this->em->persist($tools); $this->em->flush(); $chapter1 = new \Project_Model_Chapter; $chapter1->setTitle('Chapter 1'); $this->em->persist($chapter1); $chapter2 = new \Project_Model_Chapter; $chapter2->setTitle('Chapter 2'); $this->em->persist($chapter2); $chapter1->addNotice($spanner); $chapter1->addNotice($gloves); $chapter2->addNotice($spanner); $chapter2->addNotice($gloves); $chapter2->addNotice($drill); $chapter2->addNotice($goggles); // now persist and flush everything Initial investigation: I think it has something to do with HINT_REFRESH ? Stepping through: ObjectHydrator->_hydrateRow when it requests the Project_Model_Category from the unit of work, it |
| Comments |
| Comment by Benjamin Eberlei [ 15/Nov/11 ] |
|
Fixed formatting |
| Comment by Benjamin Eberlei [ 18/Nov/11 ] |
|
are you using result caching? |
| Comment by J [ 21/Nov/11 ] |
|
This is part of my bootstrap $config = new \Doctrine\ORM\Configuration(); $cache = new \Doctrine\Common\Cache\ArrayCache; $config->setMetadataCacheImpl($cache); $config->setQueryCacheImpl($cache); // driver: schema $driver = $config->newDefaultAnnotationDriver( APPLICATION_PATH . '/models' ); $config->setMetadataDriverImpl($driver); |
| Comment by Benjamin Eberlei [ 15/Dec/11 ] |
|
Cannot reproduce it with the script attached. Can you try to modify this to fail or write your own testcase? |
| Comment by Benjamin Eberlei [ 15/Dec/11 ] |
|
Downgraded |
| Comment by Alexander [ 09/Feb/13 ] |
|
Please provide extra feedback. |
[DDC-1493] Improving in() from ExpressionBuilder Created: 15/Nov/11 Updated: 15/Nov/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.1.2 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Andreas Hörnicke | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Instead of this piece of code: $literal = $expr->literal($v);
$expr->andX(
$expr->eq('at.key', $expr->literal($k)),
$expr->orX(
$expr->eq('a.valueInt', $literal),
$expr->eq('a.valueText', $literal),
$expr->eq('a.valueDate', $literal)
)
);
I would like to simplify my query by using this syntax: $expr->andX(
$expr->eq('at.key', $expr->literal($k)),
$expr->in($expr->literal($v), array('a.valueInt', 'a.valueText', 'a.valueDate'))
);
|
[DDC-1444] Be able to set a value also used in relation Created: 21/Oct/11 Updated: 21/Oct/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Cedric Lahouste | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
I am using a string field for data and for an optional relation too. I used two variables in my entity mapping to the same field. /**
/**
The getter is working fine. The problem occurs when I create a new entity and would like to persist it. At the line 525 of Doctrine\ORM\Persisters\BasicEntityPersister , I added the following test to update a null value only if there is no fieldName existing. ... } else if ($targetClass->containsForeignIdentifier) { (!isset($this->_class->fieldNames[$sourceColumn]) : Test if there is no existing fieldName What do you think about that? Thanks. |
[DDC-1423] Improving ReadOnly annotation by caching query results Created: 16/Oct/11 Updated: 16/Oct/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Joseph Silvestre | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
We should be able to tell Doctrine that we want the result of requests on ReadOnly marked Entities to be cached. For instance: CityInformation are not likely to change so it would make sense to cache it and retrieve only MoodInformation (by using an annotation on the concerned Entity). What would be even better is to tag which properies we want to hydrate from database and which properties we want to hydrate from cache. |
[DDC-1413] Automatically create index for discriminator column Created: 11/Oct/11 Updated: 11/Oct/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM, Tools |
| Affects Version/s: | 2.1.2 |
| Fix Version/s: | None |
| Type: | Improvement | Priority: | Minor |
| Reporter: | A.J. Brown | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
It would be nice if the command line orm schema-tool would suggest an index on the discriminator column for single inheritance tables. Since that column would almost always be in the query, I can't think of a case when you wouldn't want it to be in an index |
[DDC-1409] Download common 404 Created: 10/Oct/11 Updated: 10/Oct/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Thomas Tourlourat - Armetiz | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
404 on Common download link : http://www.doctrine-project.org/projects/common/download |
[DDC-1405] Define semantics of comparison operators, particularly with regard to null values Created: 06/Oct/11 Updated: 12/Oct/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation |
| Affects Version/s: | 2.1.2 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Daniel Alvarez Arribas | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
The Doctrine 2 reference documentation defines the comparison operators syntactically, as: ComparisonOperator ::= "=" | "<" | "<=" | "<>" | ">" | ">=" | "!=" Now, without experimentation, it is pure guesswork to tell whether e. g. null = null, or e. g. null <> null, or null = 0, or null <> 0 are considered true statements in DQL. In SQL semantics, all four statements would be false (or more precisely, null). In PHP semantics, both null == null and null == 0 would be true, while null != null and null != 0 would be false. It would be helpful to have the semantics of the comparison operators defined. While comparisons with non-null values behave in a common-sense way, it is hard to guess how queries involving comparison operators on fields allowing null values or null query arguments will filter the results, without knowing the exact semantics of the comparison operators with regard to null values. It would be great if this could be clarified in the docs. Thanks. |
[DDC-1373] Map file with specific class Created: 13/Sep/11 Updated: 14/Feb/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Mapping Drivers |
| Affects Version/s: | 2.1.1 |
| Fix Version/s: | 2.x |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Thomas Tourlourat - Armetiz | Assignee: | Fabio B. Silva |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Debian LAMP - PHP5.3 - Apache 2 |
||
| Description |
|
Hi there, It's a cool feature because it's allow loading on-demand. It should be great to be able to manually map XML/YAML File description to a Class, like : This feature is simple to implement, just add a new array inside AbsractFileDriver to know the mapping. AbsractFileDriver->getAllClassNames () just return value of mapping array. With this new feature, it allow developers to create a pretty folder that contains entities mapping. Armetiz. |
| Comments |
| Comment by Guilherme Blanco [ 20/Dec/11 ] |
|
Updating fix version |
[DDC-1370] preInsert, postInsert, prePersist, postPersist, preUpdate, postUpdate code and documentation of events Created: 09/Sep/11 Updated: 20/Dec/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | 2.x |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Guilherme Blanco | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Description |
|
Currently we have a set of Lifecycle events, but they seem to be misleading both in actual implementation and documentation. One good example is prePersist and postPersist, which is only fired when you're creating new entities. It should be renamed to preInsert and postInsert. But if we rename prePersist and postPersist to (pre|post)Insert, we may have a situation where you wanna cover both insert and update. |
| Comments |
| Comment by Rafael Dohms [ 09/Sep/11 ] |
|
Also, documentation for post* methods is broken at the website: "Changes in here are not relevant to the persistence in the database, but you can use this events to" It cuts off in mid-sentence. |
| Comment by Guilherme Blanco [ 09/Dec/11 ] |
|
RDohms, this paragraph was already sorted out. The actual ticket is still valid here. |
| Comment by Guilherme Blanco [ 20/Dec/11 ] |
|
Updating fix version |
[DDC-1332] Specify Custom ProxyFactory Created: 15/Aug/11 Updated: 15/Aug/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Eric Clemmons | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Description |
|
My tweet: > @beberlei Have you heard of overriding the ProxyFactory to allow caching of lazy-loaded entities? Trying to do that now The majority of our data is quite stagnant and so I was shoehorning the capability of the generated proxies to use a custom class. My new proxy, in short, will lazy-load the data as normal the first time around, but also stores it in Memcache using an injected adapter. Upon subsequent lazy-loading, memcache is used rather than a call to the DB. I can't decide if this is better suited for the EntityPersister (which has already been discussed at length), but it seems to fits nicely with a custom proxy. |
| Comments |
| Comment by Benjamin Eberlei [ 15/Aug/11 ] |
|
This is the wrong extension point to override the proxy factory. It should be in the persisters. |
| Comment by Eric Clemmons [ 15/Aug/11 ] |
|
Ah, so my doubts were well founded. The branch allowing custom EntityPersisters has not been merged in yet, has it? Or, a better question, will it be? That will dicate if I need to maintain a separate fork for this functionality or find other means to handle this. I know how hesitant we were for adding any extension point, because then we feel we have to support it, which makes me wonder if "LifeCycleCallback::preFetch" or similar is a potential alternative. |
[DDC-1329] Documentation for @JoinColumn may be incorrect Created: 13/Aug/11 Updated: 13/Aug/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation, ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Damon Jones | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
The Documentation for @JoinColumn annotation states: However, this seems not to be correct. If you have non-standard name for the @Id columns for a @OneToMany/@ManyToMany the name and referencedColumnName are not correctly inferred. https://gist.github.com/e61bf8f4462870ffd4f3 |
[DDC-1283] Possible issue with PersistentCollection#getDelete/InsertDiff() Created: 21/Jul/11 Updated: 20/Sep/12 |
|
| Status: | Reopened |
| Project: | Doctrine 2 - ORM |
| Component/s: | None |
| Affects Version/s: | 2.1 |
| Fix Version/s: | 2.4 |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Glen Ainscow | Assignee: | Guilherme Blanco |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Using the following code, when you go from (1, 2) to (1), (2) is deleted as expected. However, if you go from (1, 2) to (2), (1) and (2) are deleted and (2) is then inserted. Is this the desired behaviour? (i.e. 2 extra queries) $bracket->getTournamentLocations()->takeSnapshot();
$col = $bracket->getTournamentLocations()->unwrap();
$col->clear();
foreach ($form->getValue('tournamentLocations') as $id) {
$col->add($em->getReference('Tournaments_Model_TournamentLocation', $id));
}
$bracket->getTournamentLocations()->setDirty(true);
|
| Comments |
| Comment by Benjamin Eberlei [ 26/Jul/11 ] |
|
First, you are using internal API therefore you are on your own anyways. This is marked as improvment now, the functionality works, it may just be inefficient. |
| Comment by Guilherme Blanco [ 09/Dec/11 ] |
|
Hi, I'm marking issue as invalid because you're conceptually wrong. Correct code would be you to regenerate the collection (a new ArrayCollection) and just assign it to setTournamentLocations($newCollection); Does this explanation is enough for you? Cheers, |
| Comment by Glen Ainscow [ 23/Dec/11 ] |
|
Hi Guilherme, If I do this: $locations = new ArrayCollection();
foreach ($form->getValue('tournamentLocations') as $id) {
$locations->add($em->getReference('Tournaments_Model_TournamentLocation', $id));
}
$bracket->setTournamentLocations($locations);
... then all the records are deleted, before adding the new records. This is inefficient and causes extra, unnecessary write operations. Can't Doctrine perform diffs when persisting the collection, so that only the necessary deletes and inserts are executed? |
| Comment by Guilherme Blanco [ 13/Jan/12 ] |
|
We could add it, but I don't think it worth the effort. I'd rather consider that it's not possible to be done at the moment, but I need much more investigation for that. This will be something that I'll probably only do when I look at this issue again with a lot of time (which is really hard to happen). If you have some spare time, feel free to make some attempts. |
[DDC-1248] Documentation regarding prePersist and postPersist events a bit lacking Created: 04/Jul/11 Updated: 04/Jul/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Helmer Aaviksoo | Assignee: | Jonathan H. Wage |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Browser |
||
| Description |
|
Please make it more clear that prePersist and postPersist events are called only when creating new entity (that is, prior and after a database insert). IRC log: Pastie code (probably expired by now): $entity->setSomething('xxx'); $entity->setSomething('yyy'); |
[DDC-1247] Implement AnnotationDriver::addExcludePath Created: 04/Jul/11 Updated: 19/Sep/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Mapping Drivers |
| Affects Version/s: | Git Master |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Filip Procházka | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Description |
|
Hi, For example, I have my descendant of PHPUnit_Framework_TestCase in libs and the driver just dies, because PHPUnit is not loaded, and I don't want to load it, to be able to finish the process. Solution would be add method AnnotationDriver::addExcludePath, whose name speaks for itself Temporarily, I had to extend the AnnotationDriver and overload the crawling process, which is realy annoing, because I had to copy the whole method with all its exceptions and I would have to maintain it, till this will be in Doctrine. Can be viewed here https://github.com/Kdyby/Framework/blob/master/libs/Kdyby/Doctrine/Mapping/Driver/AnnotationDriver.php Thanks |
| Comments |
| Comment by Jan Dolecek [ 20/Apr/12 ] |
|
This behavior really messes with my projects, as it automatically loads all php files. Not just those with classes, but also simple scripts, which can do horrible stuff (e.g. I've got scripts to make changes in the source code!) Annotations should be read without executing the scripts, e.g. by TokenReflection library: https://github.com/Andrewsville/PHP-Token-Reflection |
| Comment by Patrik Votoček [ 27/Aug/12 ] |
| Comment by Christophe Coevoet [ 19/Sep/12 ] |
|
@Jan Tokenizing the file was the way annotations were handled in 2.0. Doctrine 2.1 switched to using Reflection to read annotation because it is faster. @Filip I'm wondering why you would have PHPUnit testcases in a path storing entities. |
| Comment by Filip Procházka [ 19/Sep/12 ] |
|
@stof > Tokenizing the file was the way annotations were handled in 2.0. Doctrine 2.1 switched to using Reflection to read annotation because it is faster. And it is obviousely the wrong one. There is no argument, that could beat the fact, that the result can and should be cached, as it does already. Correct behaviour is much more valuable than few miliseconds on first run. > I'm wondering why you would have PHPUnit testcases in a path storing entities. I don't. They are base classes for the actual tests. I agree they might (or should) be somewhere else, but the fact, that they should not be executed, when readed, stays. |
| Comment by Christophe Coevoet [ 19/Sep/12 ] |
|
@Filip The AnnotationReader is not loading any file. It simply expects a ReflectionClass. The ORM AnnotationDriver expects a path in which it should look for annotated classes, to be able to implement getAllClasses() (as it cannot expect all classes to be already loaded). And btw, the behavior was the same in 2.0 when the reader was using tokenization. |
[DDC-1206] Add option to SchemaTool for ignoring unsupported tables Created: 13/Jun/11 Updated: 05/Mar/12 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Tools |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Jani Hartikainen | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Description |
|
I suggest adding a new feature to SchemaTool, which allows you to ignore tables, which contain unsupported column types. Use case:
I've encountered this already a few times myself - Basically if you try to use orm:schema-tool:update with a database that contains tables with unsupported column types, it'll throw an error and you won't be able to use it at all. Because schema tool is extermely convenient when developing, I think it would be very useful to have support for this feature. Implementation: I think this should be doable by just changing SchemaTool/SchemaManager so, that SchemaManager would contain an additional method (or flag) which works like createSchema, but ignores tables that cause an exception, and SchemaTool would include a flag for using this instead of the standard approach. I'm looking into implementing this myself, and will submit a patch if this seems like a reasonable approach. |
| Comments |
| Comment by Jani Hartikainen [ 15/Jun/11 ] |
|
Relevant patches (pull request made): DBAL https://github.com/jhartikainen/dbal/tree/DDC-1206 |
| Comment by Michael Graf [ 05/Mar/12 ] |
|
has there been any progres on this feature? I have POINT in my DB and would rather ignore the table than create a custom type. |
[DDC-1198] Add PHPDocs to annotationclasses Created: 08/Jun/11 Updated: 08/Jun/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Mapping Drivers |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Robert Gruendler | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Description |
|
If an IDE would like to support annotations, it's currently only possible to display all resolvable classes in a code-hint menu when autocompleting annotations, as To make it possible for IDEs to detect classes which are explicitly meant to be used as annotations, it would be nice to agree on some common Here's an example of what this could look like: https://github.com/pulse00/doctrine2/commit/25a14e9edc406edfd33e54fc38922a191e9cbe83 This way IDEs can prioritize annotated classes in code-hints and add additional information to the user. |
[DDC-1123] Confusing error message when an ID is missing Created: 25/Apr/11 Updated: 15/Nov/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | None |
| Affects Version/s: | 2.0.4 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Jani Hartikainen | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
The error message you get when an entity is missing an ID when attempting to persist it is rather confusing. "Entity of type Some\Entity\Name is missing an assigned ID." This does not tell me anything at all. I had absolutely no idea what an assigned ID was. I totally randomly noticed that I had mistyped @GeneratedValue as @GenratedValue, and fixing it fixed the issue. Perhaps the message makes sense if you're familiar with Doctrine 2 internals, but I think it should be changed to something more helpful, such as "Entity of type X is missing primary key". Alternatively it could keep the same message, but it could suggest a possible error ("Does the entity have a primary key set?") or perhaps the documentation could include a reference to it to help debug. |
| Comments |
| Comment by Liju P M [ 15/Nov/11 ] |
|
I too came across the same issue. The error message is not up to the mark here. In my case, mapping for primary key was missing the generator strategy, <generator strategy="IDENTITY"/> Thanks Jani Hartikainen for the hint. |
[DDC-1103] Addding an event before the load of collections Created: 05/Apr/11 Updated: 05/Apr/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Christophe Coevoet | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Description |
|
An event triggered when loading collections would be useful for performances. The use case would be batch querying some stuff instead of doing a query per object of the collection in a postLoad event. |
| Comments |
| Comment by Gediminas Morkevicius [ 05/Apr/11 ] |
|
I think custom persisters will solve these issues, lets wait for them, there are already enough events |
[DDC-1081] Unnecessary JOIN when selecting ManyToMany/Join Table by ID. Created: 27/Mar/11 Updated: 28/Mar/11 |
|
| Status: | Reopened |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.0 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | David Reisch | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
With the schema:
Image
@Id
$id
Tag
@Id
$Id
Tag_Image
@Id
@OneToOne(targetEntity="Tag")
@JoinColumn(name="tag")
$tag
@Id
@OneToOne(targetEntity="Image")
@JoinColumn(name="image")
$image
Given the following DQL, SELECT img
FROM Image
LEFT JOIN img.tags tag
WHERE tag.id=:tag
Doctrine Generates this SQL
SELECT i0_.id AS id1
FROM Image i0_
LEFT JOIN Tag_Image t2_
ON i0_.id = t2_.image
LEFT JOIN Tag t1_
ON t1_.id = t2_.tag
WHERE t1_.id = 37
Which unncessarily joins against Tag, given that the foreign key Tag.id is also found in Tag_Image.tag. |
| Comments |
| Comment by Benjamin Eberlei [ 27/Mar/11 ] |
|
This is not a bug, but expected behavior. You can select against the alias if its on the owning side of the association: SELECT img FROM Image img WHERE img.tag=:tag In this case it is not a left join though, if you want a left join you HAVE to join. |
| Comment by David Reisch [ 27/Mar/11 ] |
|
There is no owning isde of the association, you can clearly see there is an association table/entity. I can't understand how this behavior is expected. If no properties of Tag are selected for, there is no need to join against Tag since the id is already available via the association table. |
| Comment by Benjamin Eberlei [ 28/Mar/11 ] |
|
I misread the mappings, sorry, i though its a @OneToOne but its actually an assocition entity with @OneToOnes. Can you show me the Image::$tags mapping also? |
| Comment by David Reisch [ 28/Mar/11 ] |
|
That is correct, thanks for taking another look at this. Image
/**
@Id
*/
$id
/**
@ManyToMany(targetEntity="Tag")
@JoinTable(name="Tag_Image",
joinColumns={@JoinColumn(name="image")},
inverseJoinColumns={@JoinColumn(name="tag")})
*/
$tags
|
| Comment by Benjamin Eberlei [ 28/Mar/11 ] |
|
The targetEntity is wrong. I suppose it should be Image_Tag or not? If it should be Tag, then you don't need that Image_Tag entity at all. In that case i have to check if you can use the shortcut notation, however it will again not work with the left join - only inner. This is an assumption the ORM makes and there is not yet code included for the optimization. This is not a bug, but an improvement ticket. The functionality works. |
| Comment by David Reisch [ 28/Mar/11 ] |
|
No argument on the ticket type... Ahh, I store some metadata in Tag_Image, which is why I manage it explicitly. In any case thanks for looking at this. |
| Comment by Benjamin Eberlei [ 28/Mar/11 ] |
|
If you change the targetEntity to Tag_Image then it might already be enough to get this working without another join. |
| Comment by David Reisch [ 28/Mar/11 ] |
|
With this change, the original query is invalid: LEFT JOIN i.tags t
WHERE t.id=:tag
Because i.tags of type Tag_Image has no field id
I attempt the logical modification: LEFT JOIN i.tags t
WHERE t.tag=:tag
and get SELECT i0_.id AS id0 FROM Image i0_ LEFT JOIN Tag_Image t1_ ON i0_.id = t1_.image LEFT JOIN Tag_Image t1_ ON t1_.id = t1_.tag WHERE t1_.tag = 37
|
[DDC-1058] Documentation on orphan removal in XML Mapping is incorrect Created: 04/Mar/11 Updated: 04/Mar/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation |
| Affects Version/s: | 2.0 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Josh Freed | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
The XML Mapping documentation indicates that "orphan-removal" is an attribute on One-to-One or Many-to-One elements, but in DoctrineORM version 2.0 that does not work. It seems I have to make "orphan-removal" a child attribute of those elements to turn it on. Just to be clear: Documentation says to do this, but it does not work: This does work: |
[DDC-1015] @DiscriminatorColumn is not required anymore Created: 03/Feb/11 Updated: 03/Feb/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Karsten Dambekalns | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Since |
[DDC-1010] Crash when fetching results from qb inside postLoad event Created: 01/Feb/11 Updated: 23/Jan/13 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.0.1 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Matevz Jekovec | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Environment: |
PHP 5.3.3-1ubuntu9.3 |
||
| Description |
|
I registered an event listener to my entity manager and on a postLoad event, I want to prepare some data in a nice way (fetch translations for my library + store into associative array into entity). Here's my snippet: class TranslationListener implements EventSubscriber { public function getSubscribedEvents() { return array(Events::postLoad); } public function postLoad(LifecycleEventArgs $args) { $em = $args->getEntityManager(); $entity = $args->getEntity(); if ($entity instanceof Lib) { $qb = $em->createQueryBuilder(); $qb = $qb->select('T')->from('Translate', 'T')->join('T.locale', 'TT')->where('T.lib = ?1')->setParameter(1, $entity->idLib); $res = $qb->getQuery()->getResult(); foreach ($res as $tr) { $entity->tr[$tr->locale->idLocale] = $tr; } } } } When this code is run (eg. getting the Library objects), I got a crash where getResult() is called:
Fatal error: Call to a member function fetch() on a non-object in /home/thepianoguy/testproject/trunk/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php on line 126
Call Stack
# Time Memory Function Location
1 0.0004 656080 {main}( ) ../index.php:0
2 0.1081 18760176 TApplication->run( ) ../index.php:48
3 0.2637 33817288 TApplication->runService( ) ../TApplication.php:382
4 0.2637 33817288 TPageService->run( ) ../TApplication.php:1095
5 0.2698 34788448 TPageService->runPage( ) ../TPageService.php:444
6 0.2715 34986768 TPage->run( ) ../TPageService.php:498
7 0.2716 34989128 TPage->processNormalRequest( ) ../TPage.php:198
8 0.3383 42770128 TControl->loadRecursive( ) ../TPage.php:215
9 0.3383 42770208 ContactUserAddEdit->onLoad( ) ../TControl.php:1286
10 0.3383 42771912 ContactUserAddEdit->loadData( ) ../ContactUserAddEdit.php:56
11 0.3452 43436904 Doctrine\ORM\AbstractQuery->getResult( ) ../ContactUserAddEdit.php:124
12 0.3452 43437296 Doctrine\ORM\AbstractQuery->execute( ) ../AbstractQuery.php:366
13 0.4160 47009328 Doctrine\ORM\Internal\Hydration\AbstractHydrator->hydrateAll( ) ../AbstractQuery.php:537
14 0.4160 47011504 Doctrine\ORM\Internal\Hydration\ObjectHydrator->_hydrateAll( ) ../AbstractHydrator.php:99
If I comment the line 137 in Doctrine/ORM/Internal/Hydration/AbstractHydrator in _cleanup(), my code works fine: I think there is a problem when using alredy used entity manager and query builder inside the postLoad event. |
| Comments |
| Comment by Benjamin Eberlei [ 02/Feb/11 ] |
|
The hydrator is reused internally, this is potentially dangerous as I figure from your use-case. |
| Comment by Benjamin Eberlei [ 02/Feb/11 ] |
|
A workaround is to re-registr the object hydrator under a new name $configuration->setHydrationMode("object2", "Doctrine\ORM\Internal\Hydration\ObjectHydrator"); and use it in your query. $query->setHydrationMode("object2");
|
| Comment by Marco Pivetta [ 23/Jan/13 ] |
|
Marking as documentation issue, since the user has to be warned that `postLoad` has to use a dedicated hydrator to execute more load operations. |
[DDC-987] How to register lifecycle callbacks from YAML is not done correctly in the Events section of the documentation. Created: 14/Jan/11 Updated: 14/Jan/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Amir | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
http://www.doctrine-project.org/docs/orm/2.0/en/reference/events.html The above URL has an example of how to register lifecycle callbacks from YAML, but actually it does not work. The correct way of doing it is mentioned on the page: http://www.doctrine-project.org/docs/orm/2.0/en/reference/yaml-mapping.html |
[DDC-986] bad cli commands in ORM introduction Created: 14/Jan/11 Updated: 15/Jan/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Documentation | Priority: | Minor |
| Reporter: | Stepan Tanasiychuk | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
I read mini tutorial http://www.doctrine-project.org/docs/orm/2.0/en/reference/introduction.html#mini-tutorial and try run command "doctrine orm:schema-tool --drop"
It's not worked for me:
But command "doctrine orm:schema-tool:drop --force" and "doctrine orm:schema-tool:create" is worked. |
[DDC-977] Allow for multiple filters to be set from the command line Created: 11/Jan/11 Updated: 11/Jan/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Tools |
| Affects Version/s: | Git Master |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Stephen Lang | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
OSX, PHP 5.3, MySQL 5.1 |
||
| Description |
|
I'm working with an existing database with a large number of tables, I would like to generate metadata mappings for a subset of tables using the command below. The Doctrine code states that the 'filter' option should be an array but there doesn't seem to be any way to pass in an array from the command line? Is the command below the syntax intended for the filter option? If so this may be a Symfony issue? Command Expected result Actual result Relevant code |
| Comments |
| Comment by Stephen Lang [ 11/Jan/11 ] |
|
Changed priority to minor. |
[DDC-957] When there is no GeneratedValue strategy on a primary key, setter function should be generated Created: 29/Dec/10 Updated: 29/Dec/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Mapping Drivers |
| Affects Version/s: | 2.0 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Flyn San | Assignee: | Jonathan H. Wage |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Environment: |
PHP 5.3.3 |
||
| Description |
|
In the YAML/XML, if no GeneratedValue strategy is given for the primary key, a setter function is required in the generated entity class. Currently only a getter is made. |
[DDC-935] copy function needs implementation Created: 15/Dec/10 Updated: 02/Jan/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.0-RC2 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Task | Priority: | Minor |
| Reporter: | Jack van Galen | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
The (deep)copy function of the entity manager is not yet implemented. I assume this is known, but I could not find any open issue on it. This is a pretty powerfull feature once implemented. The function body is completely empty however. Perhaps the tried code could be added so I and others could try and resolve the known issue with this function (recursion limit reached). |
| Comments |
| Comment by Benjamin Eberlei [ 15/Dec/10 ] |
|
There was never code written for that function. I don't think its too problematic that this is missing. You only have to implement __clone (and do so safely as the docs/cookbook describes) and then pass this structure to persist. Optionally making use of cascade persist. |
| Comment by Marcus Stöhr [ 01/Jan/11 ] |
|
I recently came accross this. Is there any best practice if you have to clone an entity who has several associations? I thought of grabbing them and clone them one by one. Or is there a more convenient way? |
| Comment by Benjamin Eberlei [ 02/Jan/11 ] |
|
no, except implementing __clone and doing it there. |
[DDC-900] Insufficient Error Information for orm:validate-schema Created: 29/Nov/10 Updated: 29/Nov/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Tools |
| Affects Version/s: | 2.0-BETA4 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | aurorius | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 2 |
| Labels: | None | ||
| Environment: |
linux, php 5.3.3 |
||
| Description |
|
Running "doctrine orm:validate-schema" would return -> [Database] FAIL - The database schema is not in sync with the current mapping file. It should have at least return the name of the table/field that is not in sync. |
[DDC-891] DDC-117: No sequence generation with composite foreign key Created: 25/Nov/10 Updated: 25/Nov/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Timo A. Hummel | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Given the following entity definitions, Doctrine does not attempt to manage generated values. For example, in MySQL, it is perfectly possible to create a composite primary key and set auto_increment on one of these. See below the code for issues that occur. User.php /**
* @Entity
*/
class User {
/**
* @Id
* @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @Column(type="string")
*/
private $name;
/**
* @OneToMany(targetEntity="PhoneNumber",mappedBy="id",cascade={"all"})
*/
private $phoneNumbers;
public function setName ($name) {
$this->name = $name;
}
}
PhoneNumber.php /**
* @Entity
*/
class PhoneNumber {
/**
* @Id
* @Column(type="integer")
* @GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @Id
* @ManyToOne(targetEntity="User",cascade={"all"})
*/
private $user;
/**
* @Column(type="string")
*/
private $phonenumber;
public function setUser (User $user) {
$this->user = $user;
}
public function setPhoneNumber ($phoneNumber) {
$this->phonenumber = $phoneNumber;
}
}
Invokation $albert = new User; $albert->setName("albert"); $em->persist($albert); $phoneAlbert1 = new PhoneNumber(); $phoneAlbert1->setUser($albert); $phoneAlbert1->setPhoneNumber("albert home: 012345"); $em->persist($phoneAlbert1); The first issue which occurs is that Doctrine does not generate the field "id" within PhoneNumber set to auto_increment. The second issue which occurs is that Doctrine becomes confused when inserting a new record into PhoneNumber, because of the following INSERT INTO statement: Insert Statement INSERT INTO PhoneNumber (user_id, phonenumber) VALUES (?, ?)
array(1) {
[1]=>
string(19) "albert home: 012345"
}
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
|
| Comments |
| Comment by Roman S. Borschel [ 25/Nov/10 ] |
|
I don't think this will ever be possible. |
| Comment by Timo A. Hummel [ 25/Nov/10 ] |
|
Is there a technical reason for that? I mean, with |
| Comment by Benjamin Eberlei [ 25/Nov/10 ] |
|
A composite key is ALWAYS of the type "ASSIGNED" and cannot be a combination of different id generation strategies. You could however write a prePersist Listener that does this for you. |
| Comment by Timo A. Hummel [ 25/Nov/10 ] |
|
Okay, maybe this is a feature for 3.0 or so. However, I'd suggest leaving this bug open as this is something which needs to be documented once Additionally, Doctrine should complain about different ID generation strategies. Right now it silently ignores it. |
[DDC-878] Don't explicitly require object members (fields) to be defined in the entity class Created: 16/Nov/10 Updated: 16/Nov/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Nick Daugherty | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Currently, Doctrine REQUIRES that a given entity class have protected or private members explicitly defined in the class (even if meta data mapping is handled elsewhere, such as in YAML). This is less than optimal...for example, many class implementations prefer to store all data in a protected $fields member, as an array, accessing the members with getters and setters. Doctrine makes this behavior impossible. An exception is thrown if a field defined in meta data is not an explicit member of the class. Instead, it should 'take the meta data's word for it' that the field exists, and is accessible via getters and setters, without explicitly checking for the member. The meta data is already the authoritative source, I don't see why the double check should (or needs to) be performed (although I am not familiar with Doctrine internals). Since Doctrine recommends making members private, I have to assume it is already hydrating them with the get/set accessors anyway...so it should just rely on them. Quick example use case (notice 'name' is not actually a member...it is stored in $fields and assume meta data is defined in a separate yaml file): class User { protected $fields = array(); public function getName() { return $this->fields['name']; } public function setName($name) { $this->fields['name'] = $name; } } |
| Comments |
| Comment by Benjamin Eberlei [ 16/Nov/10 ] |
|
This maybe a potential optimization for a very future version. However currently we heavily rely on the Reflection support for properties, which kind of makes a change of this a very complex undertaking. |
[DDC-838] SchemaTool - ignores the attribute uniq in relations Created: 13/Oct/10 Updated: 29/Oct/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Tools |
| Affects Version/s: | 2.0-BETA4 |
| Fix Version/s: | 2.x |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | gektor | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Ubuntu, PHP 5.3.2, MySQL |
||
| Description |
|
Mapper <entity name="Default_Model_Test" table="test"> <id name="id" type="integer" column="id"> <generator strategy="AUTO"/> </id> <field name="blabla" column="blabla" type="boolean"/> <one-to-one field="user" target-entity="Users_Model_User"> <join-column name="users_id" referenced-column-name="id" on-delete="CASCADE" on-update="CASCADE" unique="false" /> </one-to-one> </entity> SQL CREATE TABLE test (id INT AUTO_INCREMENT NOT NULL, users_id INT DEFAULT NULL, blabla TINYINT(1) NOT NULL, UNIQUE INDEX test_users_id_uniq (users_id), PRIMARY KEY(id)) ENGINE = InnoDB; ALTER TABLE test ADD FOREIGN KEY (users_id) REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE; Actual: Expected: |
| Comments |
| Comment by Benjamin Eberlei [ 14/Oct/10 ] |
|
Verified, i just don't understand why you are using a one-to-one relation and then "deactivate" the database constraint for this. You could easily use Many-To-One |
| Comment by gektor [ 14/Oct/10 ] |
|
You are right. It's not a bug, it's feature. |
| Comment by Benjamin Eberlei [ 29/Oct/10 ] |
|
This might still be a good improvement to allow the flexibility, but its not a bug. Updating to "Minor Improvmenet for 2.x" |
[DDC-747] Add support for table, column and indexes comments Created: 13/Aug/10 Updated: 14/Aug/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Mapping Drivers |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | s9e | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 4 |
| Labels: | None | ||
| Description |
|
It would be nice to add support for table comments, column comments and indexes comments, i.e. @Table(
name="ecommerce_products",
comment="Contains products",
indexes={@index(name="search_idx", comment="Makes finding people by name easier", columns={"name", "email"})}
)
@Column(type="integer", comment="Stores the user's age, in years")
MySQL supports comments via ALTER TABLE since 4.1. For databases that don't support those persistent comments, you could use normal SQL comments in the table definition. Of course they wouldn't be stored by the database, but at least they would appear in the generated schema, that's better than nothing. |
[DDC-740] Mantain a list of DQL reserved keywords Created: 09/Aug/10 Updated: 09/Aug/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Guilherme Blanco | Assignee: | Guilherme Blanco |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
We should keep a list of DQ reserved keywords, so users can check out what they can use or not. |
[DDC-718] Bottleneck in computeAssociationChanges()? Created: 24/Jul/10 Updated: 24/Jul/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Benjamin Eberlei | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Issue Links: |
|
||||||||
| Description |
|
It seems that since Wouldn't it be better to save the "addedEntities" in an additional map inside "PersistentCollection" and retrieve those instead of calling $value->unwrap() ? |
| Comments |
| Comment by Roman S. Borschel [ 24/Jul/10 ] |
|
Do you have any numbers to back this up? With large, hydrated collections the bottlenecks are likely elsewhere (SQL query, hydration) Further, maintaining "addedEntities" is not as trivial as you might think. The current approach does not care about what happens in-between, it just computes a diff between the old and new state of the collection at commit time. Tracking added/removed objects as they come in and go is more cumbersome. |
| Comment by Benjamin Eberlei [ 24/Jul/10 ] |
|
no numbers, i was just confused about the code, because i remembered it differently |
[DDC-712] allow RIGHT JOIN or specifying the root class of the hydratation tree Created: 21/Jul/10 Updated: 22/Jul/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | DQL, ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Mihai Ilinca | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Hi! Let me start by saying you guys did a great job with Doctrine 1 and that I can't wait to start using Doctrine2 I will explain this feature request with an example. I have a User entity wich relates one to many to a Picture entity. Picture has a " is main picture" boolean field. Not all users have a main picture. I would like to be able to select all Users, each with their main picutre, if that exists, or some Null value, if it does not exists, in one query, using join. I would also like for the result collection to contain Picture entities on the first level, with the User beinng accessible as an aggregate of Picture. The way I can think doing this is by using a RIGHT or LEFT join (not INNER) as to also select Users that don't have a main picture. I can do this by selecting SELECT Picture p, p.User u FROM p RIGHT JOIN u WITH p.main=1 but right joins afik are not available atm in either version of Doctrine, or by selecting SELECT User u, u.Picture p FROM u LEFT JOIN p WITH p.main=1 and somehow instructing the hydrator to consider Picture as the root object for the generated object tree and User as a "child" of Picture. For users without a picture, the Picture object would somehow indicate it is NULL, while still holding a refference to the User. Makes sense? |
| Comments |
| Comment by Benjamin Eberlei [ 22/Jul/10 ] |
|
Why don't you model that as ManyToOne for the Main Picture and OneToMany for all pictures? Makes much more sense from an ORM perspsective, you would have your own property "User::$mainPicture" |
| Comment by Mihai Ilinca [ 22/Jul/10 ] |
|
Thanks for the suggestion. However, this was just an example to demonstrate some lack of flexibility, I am not strictly looking for a solution to this example, but to the concept behind it. Also, how would I get the result with Picture on the top level and User aggregated to Picture with the model you suggested? Unless I am missing something, wouldn't I end up in the same situation? I can post-process the results myself and create a new collection easily, ofc, but it would be better (and more optimal) if I could tell the hydrator to do this, similar to how INDEXBY is passed as an option to the hydrator. |
Add the notion of read-only entities
(DDC-209)
|
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | DQL, ORM |
| Affects Version/s: | None |
| Fix Version/s: | 2.x |
| Security Level: | All |
| Type: | Sub-task | Priority: | Minor |
| Reporter: | Roman S. Borschel | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 5 |
| Labels: | None | ||
| Description |
|
Setting such a query hint to TRUE should result in all entities being retrieved by that query to be read-only for the purposes of change-tracking. Note that the entities themselves need not necessarily be read-only in general. This feature is a flush performance tweak that can be used to query for objects but not let the returned objects run through change-tracking on flush. Any other managed objects are tracked as usual so you can do a read-only query for 100 entities and persist a new entity in the same unit of work with optimal flushing performance. |
| Comments |
| Comment by Konstantin [ 26/Dec/11 ] |
|
Any news? |
| Comment by Gigi Largeanus [ 31/May/12 ] |
|
Any news on this? I think this is a must have feature. Thanks for all your work. |
[DDC-677] Allow DQL DELETE statements to work with join table fk constraints Created: 10/Jul/10 Updated: 10/Jul/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | None |
| Affects Version/s: | 2.0-BETA2 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Benjamin Eberlei | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Issue Links: |
|
||||||||
| Description |
|
Currently DQL DELETE will break if any foreign key constraint restricts the delete. Using the Metadata we can possibly detect these join table FK contstraints and delete them correctly. |
[DDC-547] Consider allowing custom PersistentCollection implementations Created: 27/Apr/10 Updated: 24/Dec/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.0-BETA1 |
| Fix Version/s: | 2.x |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Roman S. Borschel | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 6 |
| Labels: | None | ||
| Description |
|
We should consider allowing the configuration of custom PersistentCollection implementations on a per-association basis. For this, PersistentCollection needs to be designed for inheritance. |
| Comments |
| Comment by Roman S. Borschel [ 26/Aug/10 ] |
|
Rescheduled for 2.1. Might be 2.x. |
| Comment by Benjamin Eberlei [ 24/Dec/10 ] |
|
Reschedule for 2.x |
[DDC-530] Create tests and documentation for possibilities of mixing inheritance mapping strategies Created: 19/Apr/10 Updated: 19/Apr/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.0-BETA1 |
| Fix Version/s: | 2.0 |
| Security Level: | All |
| Type: | Task | Priority: | Minor |
| Reporter: | Roman S. Borschel | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
It is (theoretically) possible to use different inheritance mapping strategies in the same class hierarchy as long as the different subtrees that use different mapping strategies do not have a common ancestor entity. We should add some tests for that and mention it in the docs about inheritance mapping in a new subsection "Mixing Inheritance Mapping Strategies". |
[DDC-473] Inadequate description for @MappedSuperclass in Annotations Reference Created: 25/Mar/10 Updated: 26/Aug/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | Documentation |
| Affects Version/s: | 2.0-ALPHA4 |
| Fix Version/s: | 2.0 |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | David Abdemoulaie | Assignee: | Jonathan H. Wage |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
This doesn't adequately communicate how to use it. It took me several minutes of failing before I downloaded the PDF and did a search for @MappedSuperclass to find an example of how it's used. Specifically the following were unclear:
|
| Comments |
| Comment by David Abdemoulaie [ 25/Mar/10 ] |
|
Apparently it's also incompatible with several other tag as well. I thought it made sense to try the following and see if the @InheritanceType and @Discriminator___ tags would apply to the children classes: /**
* @MappedSuperclass
* @InheritanceType("SINGLE_TABLE")
* @DiscriminatorColumn(name="type", type="string")
* @DiscriminatorMap({"User" = "User", "Group" = "Group"})
*/
abstract class Principal
But apparently this flags D2 to treat it as an Entity anyway, resulting in the following error: PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'sentact5.principal' |
| Comment by Benjamin Eberlei [ 28/Mar/10 ] |
|
I updated the documentation, the question is if we should check for the mapped superclass attribute and throw exceptions if other entity level annotations are specified. |
| Comment by Roman S. Borschel [ 15/Apr/10 ] |
|
A mapped superclass has not many restrictions and these are mentioned in the docs (i.e. only unidirectional associations), what David mentions above should work, if it doesnt its a bug, I think |
| Comment by Roman S. Borschel [ 15/Apr/10 ] |
|
David, @"Is this defined on the superclass or on the children classes?" It doesnt matter. A @MappedSuperclass can be anywhere in an inheritance hierarchy and it always does the same thing, inherit its mapping information to subclasses (but its not itself an entity). The docs say: Mapped superclasses, just as regular, non-mapped classes, can appear in the middle of an otherwise mapped inheritance hierarchy (through Single Table Inheritance or Class Table Inheritance).
as well as Entities support inheritance, polymorphic associations, and polymorphic queries. Both abstract and concrete classes can be entities. Entities may extend non-entity classes as well as entity classes, and non-entity classes may extend entity classes.
So entities, mapped superclasses and plain non-mapped classes can appear mixed in an inheritance hierarchy. Nevertheless all the classes in a hierarchy that are entities must use 1 inheritance strategy, you can not mix inheritance mapping strategies in a single class hierarchy. @"If it's defined on the child classes, does it take parameters? The name of the super class?" No, it doesnt. The docs dont mention any parameters either which is correct. @"It was not at all apparent to me that it was mutually exclusive with the @Entity tag" OK, that needs to be made clearer in the docs then. |
[DDC-450] Add TableGenerator Implementation Created: 20/Mar/10 Updated: 13/Feb/12 |
|
| Status: | Reopened |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.0-ALPHA4 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Benjamin Eberlei | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 2 |
| Labels: | None | ||
| Issue Links: |
|
||||||||
| Description |
|
The TableGenerator Id Generator is not yet implemented, here is some code i came up with: class TableGenerator extends AbstractIdGenerator { private $_tableName; private $_sequenceName; private $_allocationSize; private $_nextValue; private $_maxValue; public function __construct($tableName, $sequenceName = 'default', $allocationSize = 10) { $this->_tableName = $tableName; $this->_sequenceName = $sequenceName; $this->_allocationSize = $allocationSize; } public function generate(EntityManager $em, $entity) { if ($this->_maxValue === null || $this->_nextValue == $this->_maxValue) { // Allocate new values $conn = $em->getConnection(); if ($conn->getTransactionNestingLevel() == 0) { // use select for update $sql = $conn->getDatabasePlatform()->getTableHiLoCurrentValSql($this->_tableName, $this->_sequenceName); $currentLevel = $conn->fetchColumn($sql); if ($currentLevel != null) { $this->_nextValue = $currentLevel; $this->_maxValue = $this->_nextValue + $this->_allocationSize; $updateSql = $conn->getDatabasePlatform()->getTableHiLoUpdateNextValSql( $this->_tableName, $this->_sequenceName, $this->_allocationSize ); if ($conn->executeUpdate($updateSql, array(1 => $currentLevel, 2 => $currentLevel+1)) !== 1) { // no affected rows, concurrency issue, throw exception } } else { // no current level returned, TableGenerator seems to be broken, throw exception } } else { // only table locks help here, implement this or throw exception? // or do we want to work with table locks exclusively? } } return $this->_nextValue++; } } |
| Comments |
| Comment by Guilherme Blanco [ 04/Aug/10 ] |
|
Already merged into core. |
| Comment by Benjamin Eberlei [ 04/Aug/10 ] |
|
But it is not enabled yet Furthermore the DAtabase Platform Methods are completly missing. No implementations yet. |
| Comment by Benjamin Eberlei [ 04/Aug/10 ] |
|
Schema-Tool support is also missing. |
[DDC-445] Evaluate possible ways in which stored procedures can be used Created: 19/Mar/10 Updated: 24/Dec/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | 2.x |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Roman S. Borschel | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Issue Links: |
|
||||||||
| Description |
|
We should evaluate the current situation of stored procedure support as well as where we want to go with it / how far we want to support it, if at all. |
| Comments |
| Comment by Benjamin Eberlei [ 19/Mar/10 ] |
|
I think this relates to the usage of Custom Persisters |
[DDC-415] Introduce UnitOfWork Stages and throw exceptions for wrong method uses Created: 12/Mar/10 Updated: 18/Mar/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.0-ALPHA4 |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Benjamin Eberlei | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Currently the event architecture is fragile when used wrong. I already see lots of "bug reports" popping up on this issue due to people dont understanding what is doable and what is not. How about we introduce an instance variable stage into the UnitOfWork and introduce an assertIsInStages($stages) protected method which is called ineach major command method of the UnitOfWork to verify its applied correctly? Stages could be: UNFLUSHED |
| Comments |
| Comment by Roman S. Borschel [ 12/Mar/10 ] |
|
I'm not sure. I'm afraid this will just add code bloat with the only goal to provide better error messages and its fragile to do right. There will surely be places missed in the code where to check for the stage and it might even constrain some valid use-cases we dont think of yet. So I'm afraid that this would hurt more than it would help. |
[DDC-391] Allow to specifiy custom Entity and Collection Persister classes Created: 06/Mar/10 Updated: 24/Sep/12 |
|
| Status: | In Progress |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.0-ALPHA4 |
| Fix Version/s: | 2.x |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Benjamin Eberlei | Assignee: | Benjamin Eberlei |
| Resolution: | Unresolved | Votes: | 5 |
| Labels: | None | ||
| Issue Links: |
|
||||||||||||
| Description |
|
It should be allowed to overwrite the default persisters for collections and entities. This should go along the lines of Hibernate which allows to set the custom implementations like: XML: <entity persister="persisterClass" /> <OneToMany persister="persisterClass" /> Annotation /** * @Entity(persister="persisterClass") * @OneToMany(persister="persisterClass") */ |
| Comments |
| Comment by Roman S. Borschel [ 19/May/10 ] |
|
Rescheduling for beta3. |
| Comment by Roman S. Borschel [ 07/Jul/10 ] |
|
Pushing back to beta4. |
| Comment by Roman S. Borschel [ 12/Jul/10 ] |
|
Moved to 2.1 due to lack of time for any larger new features for 2.0. |
| Comment by Benjamin Eberlei [ 13/Oct/10 ] |
|
implemented this in a feature branch for now, it really doesnt touch any other runtime code so maybe we can still merge this before RC1 http://github.com/doctrine/doctrine2/tree/OverridePersisters |
| Comment by Gediminas Morkevicius [ 25/Feb/11 ] |
|
Is this forgotten? you should merge it since it does not affect any other parts of ORM, this is a great feature |
| Comment by Benjamin Eberlei [ 26/Feb/11 ] |
|
This has not been forgotten, but the Persister is due for a heavy refactoring for 2.2 probably, when we will make it use the SQL Query object that we are working on. So I cannot merge this, because the API will probably break big time. |
| Comment by Jonas Wouters [ 16/Mar/11 ] |
|
Does that mean we will not see this feature before 2.2? |
| Comment by Benjamin Eberlei [ 16/Mar/11 ] |
|
Yes, that is correct. I dont want to add it as experimental/undocumented feature because people will take it for granted and make us responsible for possible bc breaks. I will update the target version accordingly. Sorry for disappointing you, but this feature is fundamentally important at the core of the library. That means we have to get it right and not rush into it. |
| Comment by Gediminas Morkevicius [ 17/Mar/11 ] |
|
Just as I thought that first you will want to make a query builder object for all persisters. since now they use plain sql. Thanks for all your work on this |
| Comment by Adam Brodziak [ 11/Jan/12 ] |
|
I might be mistaken, but AFAICS mentioned Persister heavy refactoring did not made through to 2.2 version. Is there any plan to have it in 2.3 or at any later stage? |
| Comment by Guilherme Blanco [ 13/Jan/12 ] |
|
@Adam I refactored all Persisters optimizing their code, but I could not complete the move from SQL string generation to Doctrine\DBAL\Query. |
| Comment by Thomas Rothe [ 05/Sep/12 ] |
|
Why is it still missing in 2.3? I would require this for an extension that uses its own overridden entity persister and using a custom persister is the solution that you guys recomend for not overriding the entity manager. |
| Comment by sebastiaan stok [ 23/Sep/12 ] |
|
Any change seeing this soon? I really need this for a security feature. What is making this so hard? just adding an setEntityPersister($entityName, $object) should do the trick. Edit: OK, I'm shot I CAN NOT overwrite the entity manager as the UnitOfWork is private! |
| Comment by Stefan Kögel [ 24/Sep/12 ] |
|
Any chance you could add this quickly? I need this feature urgently to complete an extension using a custom persister. Thanks in advance. |
[DDC-280] UnitOfWork changeSet population should take advantage of Comparable technique Created: 27/Jan/10 Updated: 04/Feb/11 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Guilherme Blanco | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Description |
|
Currently our UnitOfWork computes the changeset by checking actual instances of Objects. Unable to find source-code formatter for language: php. Available languages are: actionscript, html, java, javascript, none, sql, xhtml, xml // UnitOfWork, lines 501-507 foreach ($actualData as $propName => $actualValue) { $orgValue = isset($originalData[$propName]) ? $originalData[$propName] : null; if (is_object($orgValue) && $orgValue !== $actualValue) { $changeSet[$propName] = array($orgValue, $actualValue); } else if ($orgValue != $actualValue || ($orgValue === null ^ $actualValue === null)) $changeSet[$propName] = array($orgValue, $actualValue); } While this is ok when you do new object assignments, it just bypass same instances of same object, since the hash is the same. He implemented this datatype: Unable to find source-code formatter for language: php. Available languages are: actionscript, html, java, javascript, none, sql, xhtml, xml class EffortGraphType extends Type { public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform) { return $platform->getClobTypeDeclarationSql($fieldDeclaration); } public function convertToPHPValue($value, AbstractPlatform $platform) { return new EffortGraph(unserialize($value)); } public function convertToDatabaseValue($value, AbstractPlatform $platform) { return serialize($value->getGraphPoints()); } public function getName() { return 'effort_graph'; } } I was thinking in a possible alternative and it came up to me the same basic idea we have with operators overloading OR Comparable interface of Java. I know in Java it supports way more things, but at least for this situation (as a start point) it would make developer's life easier. Basic idea is to have an interface in Doctrine\Common: Unable to find source-code formatter for language: php. Available languages are: actionscript, html, java, javascript, none, sql, xhtml, xml namespace Doctrine\Common; interface Comparable { public function compareTo($value); } And update our UnitOfWork to take advantage of it: Unable to find source-code formatter for language: php. Available languages are: actionscript, html, java, javascript, none, sql, xhtml, xml // UnitOfWork, lines 501-507 foreach ($actualData as $propName => $actualValue) { $orgValue = isset($originalData[$propName]) ? $originalData[$propName] : null; if (is_object($orgValue)) { $isDiff = ($orgValue instanceof Doctrine\Common\Comparable) ? $orgValue->compareTo($actualValue) : ($orgValue !== $actualValue); if ($isDiff) { $changeSet[$propName] = array($orgValue, $actualValue); } } else if ($orgValue != $actualValue || ($orgValue === null ^ $actualValue === null)) $changeSet[$propName] = array($orgValue, $actualValue); } In this user's usecase, it'd require him to update the EffortGraph class and implement Comparable interface. |
| Comments |
| Comment by Guilherme Blanco [ 19/May/10 ] |
|
What's the final status of this? IMHO this should be incorporated, since it adds a powerful support that users can take advantage in our Types. Cheers, |
| Comment by Guilherme Blanco [ 19/May/10 ] |
|
You're the main guy that can give a final word in this subject. I'm +1 for this |
| Comment by Robert [ 04/Feb/11 ] |
|
+1 for this... if you have datetimes in a table and are using the DateTime object, you end up with useless update queries, if you persist an unchanged object... |
| Comment by Benjamin Eberlei [ 04/Feb/11 ] |
|
That is not true. |
| Comment by Robert [ 04/Feb/11 ] |
|
Sorry, I wasn't clear. It does not happen in all cases. I have a simple object, that I save to the session. After merging it and flushing the entitiy manager, an update query is generated, which sets all the datetime fields of the object to their current value: Unable to find source-code formatter for language: php. Available languages are: actionscript, html, java, javascript, none, sql, xhtml, xml $item = $_SESSION['item']; $item = $this->_em->merge($item); $this->_em->persist($item); $this->_em->flush(); This code results in the expected SELECT query, which refreshes the item from DB, but it also results in an update query which sets the datetime of the object to the same value. |
| Comment by Benjamin Eberlei [ 04/Feb/11 ] |
|
This rather seems like a bug with the merging. Can you open up a new ticket describing this? Thank you |
[DDC-17] Ability to skip the operation from a pre-operation event handler Created: 20/Sep/09 Updated: 26/Aug/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | None |
| Fix Version/s: | 2.x |
| Security Level: | All |
| Type: | New Feature | Priority: | Minor |
| Reporter: | Ismo Toijala | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
In Doctrine 1.1 it is possible to skip the operation in the event handlers in Doctrine_Record_Listener using Doctrine_Event::skipOperation. This no longer seems to be possible in Doctrine 2.0 Alpha 1, for example when handling a preRemove event to implement soft-delete behaviour. Perhaps a method could be added to \Doctrine\Common\EventArgs\LifecycleEventArgs to skip the operation, at least before the operation. Without this implementing soft-delete would require the user to update deleted_at and deleted_by himself and then save the record. It could no longer be done automatically when removing a record because the record is then removed. |
| Comments |
| Comment by Roman S. Borschel [ 20/Sep/09 ] |
|
The problem is, full support for soft-delete throughout the system is not feasible and very fragile. Simple soft-delete through skipping the delete operation is the easiest part. Then you will probably want to modify all DQL queries so that they adhere to it automatically and then there will always be still queries that do NOT go through DQL, like even internal lazy-load queries or native queries or others, which would need to be modified also. To sum it up, implementing soft-delete "inside" doctrine is absolutely not worth the effort and imho a bad idea and I'm certainly not willing to make lots of adjustments to the core that have a negative impact on performance just to make this soft-delete possible. I really recommend handling "soft" deletes yourself, the normal way, by simply abstracting entity retrieval and persistence through a DAO/repository layer. As a nice side-effect you get less magic and it still works when you swap out doctrine for another persistence provider. I am willing to add support for skipping deletes and maybe some other operations through events but I'm not willing to go any further, as explained above. |
[DDC-4] Implement support for Concrete Table Inheritance Created: 09/Sep/09 Updated: 24/Dec/10 |
|
| Status: | Open |
| Project: | Doctrine 2 - ORM |
| Component/s: | ORM |
| Affects Version/s: | 2.1 |
| Fix Version/s: | 2.x |
| Security Level: | All |
| Type: | Improvement | Priority: | Minor |
| Reporter: | Roman S. Borschel | Assignee: | Roman S. Borschel |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
A first implementation could probably live without support for polymorphic queries (requires SQL UNIONs to be generated). |