mysql 如何在Shopware 6DAL中实现半正矢公式?

b4lqfgs4  于 2023-02-11  发布在  Mysql
关注(0)|答案(1)|浏览(135)

我有一个自定义的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;
t3psigkw

t3psigkw1#

正如在问题的注解中所述,使用DAL进行类似这样的复杂计算,不可能在不改变其内部工作的情况下完成,这正是几乎所有抽象层的本质。
虽然确实建议在任何可能的情况下使用DAL,但我认为在达到抽象层的限制时使用“原始”SQL是绝对公平的。事件被发出,允许系统和第三方开发人员对更改做出React。这是为什么推荐使用DAL的主要方面之一。使用DAL的数据也会发出事件,相对而言,它们对整个体系结构并不重要。
我建议您尝试使用普通SQL查询预先选择表的id和距离。尽量保持简单和高效。然后将预先选择的id与实体的DAL存储库一起使用,并像这样获取完整的数据集。您可能还希望向实体示例添加扩展,以使用距离丰富它们。这样至少实际实体的数据加载事件仍然会被调度。

$idDistances = $this->connection->fetchAllAssociative(
    'SELECT LOWER(HEX(id)) AS id, (...) AS distance FROM ...'
);

$ids = array_column($idDistances, 'id');
$entities = $this->repository->search(new Criteria($ids), $context)->getEntities();

$sortedEntities = [];
foreach ($idDistances as $idDistance) {
    [$id, $distance] = $idDistance;
    $entity = $entities->get($id);

    if (!$entity) {
        continue;
    }

    $textStruct = new TextStruct();
    $textStruct->setContent($distance);
    $entity->addExtension('distance', $textStruct);

    $sortedEntities[] = $entity;
}

相关问题