gpt4 book ai didi

doctrine-orm - 使用 Criteria 和 Many-To-Many-Relation 查询中的字段名称错误

转载 作者:行者123 更新时间:2023-12-04 04:39:01 25 4
gpt4 key购买 nike

当我尝试在多对多关系中对具有不同列名的属性使用简单的条件时,Doctrine 使用属性名作为字段而不是列名。

人 ORM 定义

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

具有不同列名的属性 ORM 定义
...
name:
type: string
nullable: false
length: 50
options:
fixed: false
column: '`key`'
...

Person::hasAttribute()-方法
$criteria = Criteria::create()
->where(Criteria::expr()->eq('name', $attributeName))
->setFirstResult(0)
->setMaxResults(1);

if ($this->getAttributes()->matching($criteria)->first()) {
return true;
}

生成的语句
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` = ?"

最佳答案

问题出在“lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php”类中,在函数“loadCriteria()”中:

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

修复已添加到 github linkpull request

可以看到,上面的代码改成了:
foreach ($parameters as $parameter) {
list($name, $value) = $parameter;
$field = $this->quoteStrategy->getColumnName($name, $targetClass, $this->platform);
$whereClauses[] = sprintf('te.%s = ?', $field);
$params[] = $value;
}

当前版本不使用此修复程序。
它将成为 2.6 版本的一部分。
我建议你使用 master 分支中的代码。

更新:此修复程序自 version 2.6 起可用.

关于doctrine-orm - 使用 Criteria 和 Many-To-Many-Relation 查询中的字段名称错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46929620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com