我正在尝试在ZendFramework 2中设置一个子查询,我遇到了一个Select对象的限制函数问题。无论我做什么,数字值都放在引号之间并使我的查询失败:我应该得到LIMIT 1而不是LIMIT'1'。
似乎这不是第一次遇到这个问题,我看到有些人之前已经问过这个问题(比如8个月前),但没有得到任何正确答案。 我也看到这个问题在2012年得到了解决(https://github.com/zendframework/zf2/pull/2775),所以我真的不明白那里发生了什么。
这是我在ZF2中的代码:
$resultSet = $this->tableGateway->select( function (Select $select) use ($params) {
$sub = new Select();
$sub->from(array('temp' => 'scores'))
->columns(array(new \Zend\Db\Sql\Expression("id AS id")))
->where(array('temp.glitch' => array('None', 'Glitch')))
->where('temp.zone=scores.zone')
->order('temp.multi DESC, temp.score DESC')
->limit(1);
$select->join('players', 'player=players.id', array('player_name' => 'name', 'player_url' => 'name_url'))
->join('countries', 'players.country=countries.id', array('country_name' => 'name', 'country_iso' => 'iso'))
->join('cars', 'car=cars.id', array('car_name' => 'name'), 'left')
->join('zones', 'zone=zones.id', array('zone_name' => 'name'));
$select->where(array('scores.id' => $sub));
$select->order('scores.zone ASC');
print_r($select->getSqlString());
});
这应该呈现以下查询(除了LIMIT'1'而不是LIMIT 1,我得到了正确的答案):
SELECT "scores".*, "players"."name" AS "player_name", "players"."name_url" AS "player_url", "countries"."name" AS "country_name", "countries"."iso" AS "country_iso", "cars"."name" AS "car_name", "zones"."name" AS "zone_name"
FROM "scores" INNER JOIN "players" ON "player"="players"."id"
INNER JOIN "countries" ON "players"."country"="countries"."id"
LEFT JOIN "cars" ON "car"="cars"."id"
INNER JOIN "zones" ON "zone"="zones"."id"
WHERE "scores"."id" = (SELECT id AS id FROM "scores" AS "temp" WHERE "temp"."glitch" IN ('None', 'Glitch')
AND temp.zone=scores.zone ORDER BY "temp"."multi" DESC, "temp"."score" DESC LIMIT 1)
ORDER BY "scores"."zone" ASC
由于这似乎没有这种方式,有没有其他方法可以继续获得我的限制(使用Mysql 5数据库)?
编辑: 谢谢你的帮助。最后,我找到了一种方法,以我想要的方式完成工作,并通过简单地删除子查询结构并直接在where函数中写入来删除引号:
$select->where('scores.id = (SELECT id FROM scores AS lookup WHERE lookup.zone = scores.zone ORDER BY multi DESC , score DESC LIMIT 1)');
虽然我可以用这个来继续我的开发,但我觉得更像是用一个糟糕的技巧来解决这个问题,所以我会让这个问题得不到答案,直到有人在那里找到真正的解决方案。 无论如何,可能根本没有解决方案,因为它可能是ZF2核心本身的一个问题。
答案 0 :(得分:1)
更改行 -
$select->where(array('scores.id' => $sub));
与
$select->where(array('scores.id' => new \Zend\Db\Sql\Expression("({$sub->getSqlString($this->tableGateway->adapter->getPlatform())})"));
尝试上述变化。
如果它仍然无效,则更改位于 -
的核心Select
类文件
PROJECT_FOLDER/vendor/zendframework/zendframework/library/Zend/Db/Sql/Select.php
第921行 -
使用$sql = $platform->quoteValue($limit);
$sql = $limit;
第940行 -
使用return array($platform->quoteValue($offset));
return array($offset);
醇>
我从github遇到过这个问题,并想知道为什么它还没有使用最新的ZF2文件。我知道上面给出的解决方案看起来不合适但我必须以某种方式使其工作。我已经尝试过它并且有效。
在实际解决方案出现之前,它只是一个快速解决方案。