【问题标题】:Access multiple foreign fields in a Virtual Field?访问虚拟字段中的多个外国字段?
【发布时间】:2014-01-30 17:48:08
【问题描述】:

两张表,在 Cakephp 中正确设置了关系:

属性(...、postcode_id、...)和邮政编码(id、邮政编码、纬度、经度)。

在属性 beforeFind() 中创建的虚拟字段计算搜索邮政编码和记录邮政编码之间的距离。因此,要获取纬度/经度,我需要通过 Property 记录中的外键从 Postcode 表中检索一条记录,所有这些都在虚拟字段声明中。

我该怎么做?多个 SELECT 嵌套在其中?嵌套的 find(),这可能会更糟?我认为只使用 RelatedModel.fieldName 就可以了 - 它没有。

编辑:Property belongsTo Postcode, Postcode hasMany Property

(使用 cakephp v2.4.4)

Property beforeFind() 中的虚拟字段:

$this->virtualFields['distance'] = 6371 . ' * ACOS(
    (SIN(RADIANS(Postcode.latitude)) * ' . $searchPostcode['latitudeSin'] . ') +
    (COS(RADIANS(Postcode.latitude)) * ' . $searchPostcode['latitudeCos'] . ') *
     COS(RADIANS(Postcode.longitude) - ' . $searchPostcode['longitude'] . ')
)';

【问题讨论】:

  • 这并不能直接回答您的问题,但您是否查看过 behavior 的面包店,您可以利用它来解决邮政编码的距离问题
  • 谢谢,但我不确定需要做多少工作才能兼容 CakePHP 2。无论哪种方式,我都希望我可以在这里使用更通用的东西来处理任何有此问题的计算字段,而不仅仅是地理字段。

标签: php mysql cakephp foreign-keys cakephp-2.4


【解决方案1】:

您需要在您正在搜索的表和保存 lng/lat 的表之间进行手动连接,例如,$options['joins'] = array(array('table' => ' model2', 'alias' => 'Model2', 'conditions' => array('Model2.model1_id = Model1.id')));然后在你的虚拟领域,我认为你应该能够使用 Model2.lat 和 Model2.lng 并让它工作。

【讨论】:

  • 我确实按照蛋糕的规定建立了关系 - 那我不是要加入模特两次吗?
  • 为此将模型的递归属性设置为-1,如果您需要其他关联模型,请改用可包含行为,这样它就不会再次尝试自动获取第二个模型。您需要这样做,因为 cake 自然会获得具有多个查询的关联模型——这是一个问题,因为您需要在一个查询中获取 Model1 和 Model2。另一种可能的选择是,如果模型之间是 hasOne 或 belongsTo 关系,您可以将虚拟字段放在 Model2 上,因为分页器组件可以让您按直接关联的模型进行排序。
  • 我有 public $recursive = -1;在应用模型中。我收到错误:SQLSTATE [42S22]:找不到列:1054 '字段列表'中的未知列'Postcode.latitude'。我是否错误地引用了该字段?
  • 请发布它正在尝试的 MySQL 查询,以及您的分页选项。
【解决方案2】:

我有它的工作,但我不得不在每个外部调用中嵌套另一个 SELECT,这不是最好的解决方案。例如,

RADIANS((SELECT latitude FROM postcodes WHERE id = Property.postcode_id))

这也意味着相同的值,纬度,被检索两次,所以这不是很好。

如果你有更好的解决方案,请分享!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多