3

POINT住所データと「座標」という名前の空間フィールドを持つ mysql テーブルから生成されたモデル タイプがあります。モデルが作成または更新されたら、住所をジオコーディングし、緯度と経度の座標をPOINTフィールドに保存します。

beforeSave私の理解では、これを行う方法は、モデルのメソッドで住所をジオコーディングすることです。私はこれを行い、連想配列に座標を持っています。私の質問は、このデータを座標フィールドに挿入するにはどうすればよいですか? これは私がしようとしているものです:

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();
}

これを行うと、次のエラーが表示されます。

CDbCommand は SQL ステートメントの実行に失敗しました: SQLSTATE[HY093]: 無効なパラメーター番号: バインドされた変数の数がトークンの数と一致しません。実行された SQL ステートメント: INSERT INTO place ( city, state, name, street, postal_code, phone, ) VALUES (:yp0 created, coordinates:yp1, :yp2, :yp3, :yp4, :yp5, UTC_TIMESTAMP(), GeomFromText('POINT(:lat :lng) )'))

4

2 に答える 2

4

代わりにこれを試してください

 $this->coordinates = new CDbExpression("GeomFromText(:point)",
        array(':point'=>'POINT('.$coords['lat'].' '.$coords['lng'].')'));
于 2012-09-21T19:30:16.977 に答える
4

Yii 2を使用している場合は、@dlnGd0nG の回答を少し編集してください

$this->coordinates = new yii\db\Expression("GeomFromText(:point)",
    array(':point'=>'POINT('.$coords['lat'].' '.$coords['lng'].')'));
于 2015-08-02T08:02:06.353 に答える