How do I insert a mysql spatial point with a yii model?

梦想的初衷 提交于 2019-12-21 20:44:30

问题


I have a model type that was generated from a mysql table that has address data and also a spatial POINT field named "coordinates". When a model is created or updated I want to geocode the address and store the latitude and longitude coordinates in the POINT field.

My understanding is the way to do this is to geocode the address in the model's beforeSave method. I have done this and have the coordinates in an associative array. Now my question is how can I insert this data into my coordinates field? This is what I'm trying:

public function beforeSave()
{
    $singleLineAddress = $this->getSingleLineAddress();
    $coords = Geocoder::getCoordinates($singleLineAddress);

    // WORKS: using the following line works to insert POINT(0 0)
    //$this->coordinates = new CDbExpression("GeomFromText('POINT(0 0)')");

    // DOESN'T WORK: using the following line gives an error
    $this->coordinates = new CDbExpression("GeomFromText('POINT(:lat :lng)')",
        array(':lat' => $coords['lat'], ':lng' => $coords['lng'] ));

    return parent::beforeSave();
}

When I do this I get the following error:

CDbCommand failed to execute the SQL statement: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens. The SQL statement executed was: INSERT INTO place (city, state, name, street, postal_code, phone, created, coordinates) VALUES (:yp0, :yp1, :yp2, :yp3, :yp4, :yp5, UTC_TIMESTAMP(), GeomFromText('POINT(:lat :lng)'))


回答1:


Try this instead

 $this->coordinates = new CDbExpression("GeomFromText(:point)",
        array(':point'=>'POINT('.$coords['lat'].' '.$coords['lng'].')'));



回答2:


Small edit in @dlnGd0nG 's answer if you are using Yii 2

$this->coordinates = new yii\db\Expression("GeomFromText(:point)",
    array(':point'=>'POINT('.$coords['lat'].' '.$coords['lng'].')'));


来源:https://stackoverflow.com/questions/12535245/how-do-i-insert-a-mysql-spatial-point-with-a-yii-model

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!