我正在編寫代碼以返回位於指定區域內的位置列表,並且接近某個經度和緯度。數據庫佈局是有一個包含業務的位置表,一個區域表(它定義了區域(UrlName是一個標識該區域的塊)和一個將區域映射到位置的區域位置表。將從SQL查詢計算的字段添加到Yii2 ActiveRecord模型
SQL查詢非常多毛,但它計算一個名爲「Distance」的虛擬列,我希望在返回的模型中可以訪問該列。
這裏是出現在我的位置模型的代碼的縮寫版本:
public static function getByRegionAndLatLong($regionName, $lat, $long) {
$sql = "SELECT
`Location`.`LocationId`,
`Location`.`Latitude`,
`Location`.`Longitude`,
(
3959 * acos (
cos (radians(:Latitude))
* cos(radians(latitude))
* cos(radians(longitude) - radians(:Longitude))
+ sin (radians(:Latitude))
* sin(radians(latitude))
)
) AS Distance
FROM Location
LEFT JOIN RegionLocation RL
ON RL.LocationId = Location.LocationId
LEFT JOIN Region R
ON R.RegionId = RL.RegionId
WHERE R.UrlName= :UrlName
ORDER BY Distance ;
";
return Location::findBySql($sql, [
':Latitude' => $lat,
':Longitude' => $long,
':UrlName' => $UrlName
])->all();
}
的問題是,當我運行查詢,我想爲所計算的「距離」一欄被列入結果。但是,由於數據庫中沒有名爲「距離」的實際字段,因此Yii2的ActiveRecord類將不會將字段添加到生成的模型中。
我可以通過在Location表中創建一個名爲「Distance」的列來避開它,但我希望有一種方法可以在不更改數據庫的情況下執行此操作。
我最終的目的是讓模型返回一個Location對象數組,每個Location對象都有一個「Distance」屬性。
public function actionGetStudiosByLatLong($regionName = '', $latitude='', $longitude='') {
\Yii::$app->response->format = 'json';
return Location::getByRegionAndLatLong($regionName, $latitude, $longitude);
}
函數在模型中?並返回一組行? – scaisEdge
正確。但它是一個web服務,最終將輸出整個集合作爲json對象。 – TMorgan