我试图将ORDER BY列作为DQL中的参数传递,如下所示:
$this->em->createQuery("SELECT t FROM Entities\Topic t ORDER BY :order")
->setParameters( array('order' => 't.name') )->getResult();
我猜它不起作用,因为setParameter会转义:order,但是下面的解决方案似乎不太好:
$order = 't.name'; // Dynamic value
$this->em->createQuery("SELECT t FROM Entities\Topic t ORDER BY $order")
->getResult();
有没有更好的方法来解决这个问题?
答案 0 :(得分:3)
在这种情况下,使用Doctrines Querybuilder:
$order = 't.name'; // Dynamic value
$qb = $this->_em->createQueryBuilder();
$qb->select('t')
->from('Entities\Topic', 't')
->orderBy($order);
答案 1 :(得分:0)
我知道,这是一个老问题,但直到今天这个“问题”仍然存在。所以,如果你想使用动态排序,你应该使用学说 queryBuilder。
我最近测试了当前可用于动态排序的学说类型。 就我而言,我在 dql 中设置了 order 列,只想注入 ASC/DESC。
现在,这是测试输出:
DQL: SELECT w FROM App\Entity\Worker w ORDER BY w.id :order
Type "array" is invalid
Type "ascii_string" is invalid
Type "bigint" is invalid
Type "binary" is invalid
Type "blob" is invalid
Type "boolean" is invalid
Type "date" is invalid
Type "date_immutable" is invalid
Type "dateinterval" is invalid
Type "datetime" is invalid
Type "datetime_immutable" is invalid
Type "datetimetz" is invalid
Type "datetimetz_immutable" is invalid
Type "decimal" is invalid
Type "float" is invalid
Type "guid" is invalid
Type "integer" is invalid
Type "json" is invalid
Type "object" is invalid
Type "simple_array" is invalid
Type "smallint" is invalid
Type "string" is invalid
Type "text" is invalid
Type "time" is invalid
Type "time_immutable" is invalid
我使用的是 Symfony 5.3 和 Doctrine 2.9
如果有人对代码感兴趣,我曾经测试过:我只是在我的 symfony 项目中创建了一个学说实体。然后我在相关的存储库对象中创建了一个测试方法:
public function testOrder(string $order = 'ASC'): array
{
$query = $this->getEntityManager()->createQuery(
'SELECT w
FROM App\Entity\Worker w
ORDER BY w.id :order'
);
// map taken from: vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Type.php:101
$doctrineTypeMap = [
Types::ARRAY,
Types::ASCII_STRING,
Types::BIGINT,
Types::BINARY,
Types::BLOB,
Types::BOOLEAN,
Types::DATE_MUTABLE,
Types::DATE_IMMUTABLE,
Types::DATEINTERVAL,
Types::DATETIME_MUTABLE,
Types::DATETIME_IMMUTABLE,
Types::DATETIMETZ_MUTABLE,
Types::DATETIMETZ_IMMUTABLE,
Types::DECIMAL,
Types::FLOAT,
Types::GUID,
Types::INTEGER,
Types::JSON,
Types::OBJECT,
Types::SIMPLE_ARRAY,
Types::SMALLINT,
Types::STRING,
Types::TEXT,
Types::TIME_MUTABLE,
Types::TIME_IMMUTABLE,
];
print_r('DQL: ' . $query->getDQL() . "<br/>");
foreach ($doctrineTypeMap as $mappedType) {
try {
$query->setParameter('order', $order, $mappedType);
print_r('Type "' . $mappedType . '" is ');
$query->getSQL();
print_r('valid' . "<br/>");
} catch (\Exception $e) {
print_r('invalid' . "<br/>");
}
}
// Prevent symfony from rendering a view
die();
}