Wrong fieldname in query with Criteria and Many-To-Many-Relation

匿名 (未验证) 提交于 2019-12-03 01:20:02

问题:

When I try to use a simple Criteria on a property with a different columnname in Many-To-Many-Relation, Doctrine uses the propertyname as the field and not the columnname.

Person ORM Definition

... manyToMany:     attributes:         targetEntity: Attributes         cascade: ['persist']         joinTable:             name: person_attribute             joinColumns:                 person_id:                     referencedColumnName: id             inverseJoinColumns:                 attribute_id:                     referencedColumnName: id ... 

Attribute ORM Definition with differing columnname

... name:     type: string     nullable: false     length: 50     options:         fixed: false     column: '`key`' ... 

Person::hasAttribute()-Method

$criteria = Criteria::create()     ->where(Criteria::expr()->eq('name', $attributeName))     ->setFirstResult(0)     ->setMaxResults(1);  if ($this->getAttributes()->matching($criteria)->first()) {     return true; } 

The generated Statement

SELECT      te.id AS id,      te.description AS description,      te.key AS key  FROM      attribute te  JOIN      person_attribute t  ON      t.attribute_id = te.id  WHERE      t.person_id = ?          AND      te.name = ?     ## <- This should be "te.`key` = ?" 

回答1:

The issue is in "lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php" class, in function "loadCriteria()" at lines:

foreach ($parameters as $parameter) {         list($name, $value) = $parameter;         $whereClauses[]     = sprintf('te.%s = ?', $name);         $params[]           = $value; } 

the fix was added at github link and the pull request

As you can see, the above code was changed to:

foreach ($parameters as $parameter) {         list($name, $value) = $parameter;         $field = $this->quoteStrategy->getColumnName($name, $targetClass, $this->platform);         $whereClauses[]     = sprintf('te.%s = ?', $field);         $params[]           = $value; } 

Current releases do not use this fix. It will be part of 2.6 release. I suggest you use the code in the master branch.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!