我有一个自定义的Shopware 6实体称为位置与lat和lng字段是存储坐标。我想使用Shopware的DAL,因为文档说,你应该始终使用DAL的存储API路线,我正在尝试这样做的存储API路线。有没有任何方法与常规Shopware的DAL实现半正矢公式?
这是纯SQL中的公式:
SELECT id, ( 6371 * acos( cos( radians(input_latitude) ) * cos( radians(
latitude ) )
* cos( radians( longitude ) - radians(100.56133310918271) ) + sin( radians(input_longitude) ) * sin(radians(input_latitude)) ) ) AS distance
FROM location
HAVING distance < 1
ORDER BY distance
LIMIT 0 , 500;
1条答案
按热度按时间t3psigkw1#
正如在问题的注解中所述,使用DAL进行类似这样的复杂计算,不可能在不改变其内部工作的情况下完成,这正是几乎所有抽象层的本质。
虽然确实建议在任何可能的情况下使用DAL,但我认为在达到抽象层的限制时使用“原始”SQL是绝对公平的。事件被发出,允许系统和第三方开发人员对更改做出React。这是为什么推荐使用DAL的主要方面之一。使用DAL的数据也会发出事件,相对而言,它们对整个体系结构并不重要。
我建议您尝试使用普通SQL查询预先选择表的id和距离。尽量保持简单和高效。然后将预先选择的id与实体的DAL存储库一起使用,并像这样获取完整的数据集。您可能还希望向实体示例添加扩展,以使用距离丰富它们。这样至少实际实体的数据加载事件仍然会被调度。