[英]Doctrine2 Native Query: Rows are shifted
我想使用Doctrine結果映射,但是得到一個非常奇怪的結果。
這是我在存儲庫“結果”中的代碼:
$sql = 'SELECT * FROM (
SELECT
k.id AS keyword_id,
k.name,
r.position,
r.date,
r.id
FROM
Result r
INNER JOIN Keyword k ON r.keyword_id = k.id
WHERE r.domain_id = 2005
ORDER BY
date DESC
) AS foo
GROUP BY
CONCAT(name, DATE_FORMAT(date, \'%Y%m\') )
ORDER BY
CONCAT(name, date) ASC;';
$rsm = new ResultSetMapping;
$rsm->addEntityResult('XXX\SesBundle\Entity\Result', 'r');
$rsm->addFieldResult('r', 'id', 'id');
$rsm->addFieldResult('r', 'position', 'position');
$rsm->addFieldResult('r', 'date', 'date');
$rsm->addJoinedEntityResult('XXX\SesBundle\Entity\Keyword', 'k', 'r', 'keyword');
$rsm->addFieldResult('k', 'keyword_id', 'id');
$rsm->addFieldResult('k', 'name', 'name');
$em = $this->getEntityManager();
$results = $em->createNativeQuery($sql, $rsm)
->getResult();
return $results;
必須有20個結果,如果我count($results)
,結果是20。
但是如果我var_dump($ result [19])我得到這個轉儲:
[19] =>
class Example\SesBundle\Entity\Result#1565 (7) {
private $id =>
int(498)
private $url =>
NULL
private $position =>
int(30)
private $date =>
class DateTime#1594 (3) {
public $date =>
string(19) "2012-10-02 12:04:17"
public $timezone_type =>
int(3)
public $timezone =>
string(13) "Europe/Berlin"
}
private $keyword =>
NULL
private $domain =>
NULL
private $engine =>
NULL
}
}
看,private $keyword
是NULL
。 正確的轉儲應如下所示:
[16] =>
class Example\SesBundle\Entity\Result#1623 (7) {
private $id =>
int(19)
private $url =>
NULL
private $position =>
int(2)
private $date =>
class DateTime#1619 (3) {
public $date =>
string(19) "2012-09-28 17:33:26"
public $timezone_type =>
int(3)
public $timezone =>
string(13) "Europe/Berlin"
}
private $keyword =>
class Example\SesBundle\Entity\Keyword#1647 (3) {
private $id =>
int(2376)
private $name =>
string(19) "Example"
private $domain =>
class Doctrine\ORM\PersistentCollection#1624 (9) {
...
}
}
private $domain =>
NULL
private $engine =>
NULL
}
另外還有另一個非常奇怪的行為。 結果被“轉移”。 假定為$result[0]
未出現在var_dump()
。 如果執行了代碼,則$result[0]
是應該為$result[1]
,但是其結果的ID應該為$result[0]
。 所以我認為映射不太正確。
如果我在Navicat中執行SQL語句,那么一切都非常正確。
對不起,我的英語不好,我希望你明白我的意思:)
解決方法如下:
使用addJoinedEntityResult
您必須按照與選擇sql語句中的列相同的順序進行映射。
有關更多信息,請訪問: http : //www.doctrine-project.org/jira/browse/ddc-1362
我不知道學說團隊為什么要關閉票。
感謝@ luka8088提供此解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.