ActiveRecord использование having (вычисление дистанции)

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Richi
Сообщения: 33
Зарегистрирован: 2011.05.09, 13:23
Откуда: Новосибирск
Контактная информация:

ActiveRecord использование having (вычисление дистанции)

Сообщение Richi »

Привет.
Есть объекты "здание" с координатами lat, lng
Есть "фирмы" которые привязаны к конкретным зданиям.
Задача: сделать поиск фирм находящихся внутри определенного радиуса относительно указанной точки.
Нашел алгоритм для вычисления дистанции (https://developers.google.com/maps/arti ... indnearsql). Пример:

Код: Выделить всё

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;
Но вопрос как это теперь реализовать в рамках Yii2?
У меня есть:

Код: Выделить всё

$query = Firm::find()->joinWith(['building']);

// some other filters
if (!empty($params['rubric-id'])) {
    $query->andFilterWhere([
         'rubric_id' => $params['rubric-id']
    ]);
}

// find by radius
if (!empty($params['point-lat']) && !empty($params['point-lng'])) {
    // ???
}

$activeDataProvider = new ActiveDataProvider([
    'query' => $query
]);
 
Как мне правильно добавить в выборку вычисляемое поле distance и вообще возможно ли это в рамках ActiveRecord?
Спасибо!
http://gildman.ru - мой ещё совсем зелёный блог
ShNURoK
Сообщения: 168
Зарегистрирован: 2012.04.12, 05:44
Контактная информация:

Re: ActiveRecord использование having (вычисление дистанции)

Сообщение ShNURoK »

Нужно будет описать селект через Expression

Пример:

Код: Выделить всё

$quotes = Quote::find()->select(['id', new \yii\db\Expression("CONCAT(`name`, ' model id: ', `id`) as name")])->all();
Ответить