我正在编写代码来返回指定区域内且接近特定纬度和经度的位置列表。数据库布局是,有一个包含企业的位置表、一个定义区域的区域表(UrlName 是标识区域的 slug)以及一个将区域映射到位置的区域位置表。
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();
}
问题是,当我运行查询时,我希望计算出的“距离”列包含在结果中。但是,由于数据库中没有名为“Distance”的实际字段,Yii2 的 ActiveRecord 类不会将该字段添加到生成的模型中。
我可以通过在位置表中创建一个名为“距离”的列来解决这个问题,但我希望有一种方法可以在不更改数据库的情况下完成此操作。
我的最终目的是让模型返回一个位置对象数组,每个位置对象都有一个“距离”属性。然后, Controller 将使用类似于以下的代码生成 json feed:
public function actionGetStudiosByLatLong( $regionName = '', $latitude='', $longitude='') {
\Yii::$app->response->format = 'json';
return Location::getByRegionAndLatLong( $regionName, $latitude, $longitude );
}
最佳答案
您应该简单地将此属性添加到您的类中:
class Location extends \yii\db\ActiveRecord
{
public function attributes()
{
// add distance attribute (will work for json output)
return array_merge(parent::attributes(), ['Distance']);
}
// ...
}
了解更多关于Selecting extra fields的信息.
关于yii2 - 将 SQL 查询计算出的字段添加到 Yii2 ActiveRecord 模型中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39757358/