2016-11-25 4 views
1

Ich habe eine Yii2 searchQuery-Einrichtung, die sehr gut für die Berechnung der Datensätze funktioniert, die nicht im gewünschten Radius eines bestimmten Punktes liegen.Rückgabe eines Wertes aus einer MySQL-Auswahl mit Funktion unter Verwendung einer Yii2-Abfrage

public function search($params) 
{ 
$query = TrainerExtend::find(); 
$dataProvider = new ActiveDataProvider([ 
    'query'  => $query, 
    'pagination' => [ 
    'pageSize' => $this->pageSize, 
    ], 
]); 
$this->load($params); 
$query->having([ 
    '<', 
    'ST_Distance_Sphere(POINT(' . $this->longitude . ',' . $this->latitude . '), 
     PointFromText(CONCAT(\'POINT(\',longitude,\'\',latitude,\')\')))', 
     $this->radius * 1000 
]); 
} 
    $rows = $query->distinct(); 

    return $dataProvider; 
} 

public function actionFind() 
{ 
    $searchModel = new TrainerSearch(); 
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 

    $trainers = $dataProvider->getModels(); 

    if (array_key_exists('trainerSearch',Yii::$app->request->queryParams) 
     && !empty($trainerSearch = Yii::$app->request->queryParams['TrainerSearch'])) 
    { 
     if (array_key_exists('specialties',$trainerSearch) && !empty($specialities = $trainerSearch['specialties'])) 
     { 
      foreach ($trainers as $trainer) { 
       $specialties = $trainer->trainerSpecialtiesArray; 
       $trainer->match = $this->caluclateRelevance($specialties); 
      } 
     } 
    } 
    return $this->render('find', [ 
     'searchModel' => $searchModel, 
     'dataProvider' => $dataProvider, 
    ]); 
} 

resultierende Abfrage

SELECT DISTINCT * FROM `trainer` WHERE `gender`='0' HAVING ST_Distance_Sphere(POINT(-123.3836214,48.418248899999995), PointFromText(CONCAT('POINT(',longitude,' ',latitude,')'))) < 59000 LIMIT 2` 

Datensatz resultiert, wird für Berechnungen schlagen Radius auf, aber ich brauche die Entfernung von der Geo-Funktion als auch berechnet. Ich habe versucht, ein as-Schlüsselwort zu verwenden, aber es unterbricht die Abfrage.

+0

überprüfen Sie die resultierende Abfrage echo Yii :: $ app-> db-> createCommand ($ query) -> sql – scaisEdge

+0

Diese Abfrage funktioniert gut ... die resultierende SQL-Anweisung ist: SELECT DISTINCT * FROM 'Trainer' WHERE ' Geschlecht' = '0' HAVING ST_Distance_Sphere (POINT (-123.3836214,48.418248899999995), PointFromText (CONCAT ('POINT (', Längengrad, '', Breite, ')'))) <59000 LIMIT 2 Ich muss das Ergebnis erhalten Abstand zurück zum Controller irgendwie und ich weiß nicht, hacke –

+0

zeigen Sie den Code, wo Sie bauen und führen Sie die Abfrage (aber uodate die Frage .. sonst ist wirklich schwer lesen Sie den Code ..) – scaisEdge

Antwort

2

Für berechnete Spalte Sie die richtige Auswahlcode hinzufügen müssen Sie

$query->->addSelect(["*", 
     "ST_Distance_Sphere(POINT($this->longitude , 
      $this->latitude), 
      PointFromText(CONCAT('POINT(',longitude,' ',latitude,')')))as distance"]); 

dann zeigen das Ergebnis

erste Abfrage Sie einen öffentlichen var hinzufügen sollten in ihr Modell zB:

class TrainerExtend extends \yii\db\ActiveRecord 
    { 

     public $distance; // codice di stato del codice fiscale 
     ...... 

     public static function tableName() 
     { 
     .... 

und zweitens können Sie die Entfernung als Modellattribut in Ihren Ansichten verwenden, zB: gridview

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    ...... 
    'columns' => [ 
     ..... 
     'distance', 
     ... 
Verwandte Themen