2016-12-23 15 views
0

X半径の範囲内にあるすべての郵便番号を見つけようとしていますが、です。TypeErrorを受け取りました。Laravel緯度と経度の半径

私はこのエラーを取得しています:

Type error: Argument 1 passed to App\Transformers\PostcodesTransformer::transform() must be an instance of App\Postcodes, instance of stdClass given, called in /home/vagrant/postcode-data/vendor/league/fractal/src/Scope.php on line 338

クエリは次のとおりです。

$postcodes = DB::select("Select 
    id, 
    postcode, 
    latitude, 
    longitude, 
    district, 
    postal_town, 
    county, 
    country, 
    northing, 
    easting, 
    type, 
    acos(sin(".$lat.")*sin(radians(latitude)) + cos(".$lat.")*cos(radians(latitude))*cos(radians(longitude)-".$lon.")) * ".$R." As distance 
     From (
      Select * 
      From uk_postcodes 
      Where latitude Between ".$minLat." And ".$maxLat." 
       And longitude Between ".$minLon." And ".$maxLon." 
     ) As FirstCut 
     Where acos(sin(".$lat.")*sin(radians(latitude)) + cos(".$lat.")*cos(radians(latitude))*cos(radians(longitude)-".$lon.")) * ".$R."< ".$rad." 
     Order by distance"); 
    return $this->response->withCollection($postcodes, new PostcodesTransformer); 

DB::selectクエリの結果がstdClassを返しますが。

Postcodesクラスのインスタンスを返す方法を教えてください。

答えて

0

あなたのコードによれば、LaravelのEloquent Modelの概念を使用してデータベースにクエリを実行しているわけではありません。

約について:Eloquent: Getting Started

ですから、このような郵便番号オブジェクトのコレクションを持つことができます。

このようなPostcodeという名前のモデルを作成します。

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Postcode extends Model 
{ 
    protected $table = 'postcodes'; 
    protected $guarded = ['id']; 
} 

を次に、あなたのクエリを作成するとき、あなたはあなたができる、このようにそれを行うことができますあなたは今Postcodeモデルオブジェのコレクションを取得します

$postcodes = Postcode::selectRaw(" 
    *, 
    acos(sin(".$lat.")*sin(radians(latitude)) + cos(".$lat.")*cos(radians(latitude))*cos(radians(longitude)-".$lon.")) * ".$R." As distance 
     From (
      Select * 
      From uk_postcodes 
      Where latitude Between ".$minLat." And ".$maxLat." 
       And longitude Between ".$minLon." And ".$maxLon." 
     ) As FirstCut 
     Where acos(sin(".$lat.")*sin(radians(latitude)) + cos(".$lat.")*cos(radians(latitude))*cos(radians(longitude)-".$lon.")) * ".$R."< ".$rad." 
") 
->orderBy('distance', 'asc') 
->get(); 

selectRaw() - Laravelのクエリビルダのメソッドを使用します代わりにStdClassのcts。選択した生のクエリをより深く壊した方が良いでしょう。それはうまくいかないようです。

+0

返事ありがとうございますSaumya。残念ながら、これはうまくいきませんでした。これは、2回の「from」クエリを実行するためです。 http://pastebin.com/xkBFP82t – MikeF

+0

ええ、これを分割して試してみてください! –

+0

私はすでにPostcodesモデルを定義していました。私は、 'selectRaw()'を使ってこれを実行しようとしているかどうかは完全にはわかりません。私は 'from'のサブクエリを実行する必要があります – MikeF

1

可能な回答は2つあります。最初は間違った方法だと思っていますが、それはあなたの質問に対するより直接的な答えです。

Eloquentを使用してこのクエリを取得する必要がありますが、テーブルを処理するには、まずポストコードテーブルから選択して、一時テーブルを使用するようにクエリを変換する必要があります。

DB::query(" 
    Create Temporary Table FirstCut Select * 
    From uk_postcodes 
    Where latitude Between ".$minLat." And ".$maxLat." 
    And longitude Between ".$minLon." And ".$maxLon 
); 

そして今、我々はあなたのモデルを使用してpostcodes表とその参加できます。我々はまた、それがApp\Postcodes

Postcodes::join('FirstCut', 'FirstCut.zipcode', '=', 'postcodes.zipcode') // Guessing column names here 
    ->selectRaw('id, postcode, latitude, longitude, district, postal_town, county, country, northing, easting, type, 
     acos(sin(".$lat.")*sin(radians(latitude)) + cos(".$lat.")*cos(radians(latitude))*cos(radians(longitude)-".$lon.")) * ".$R." As distance' 
    ) 
    ->whereRaw("acos(sin($lat)*sin(radians(latitude)) + cos($lat)*cos(radians(latitude))*cos(radians(longitude)-$lon)) * $R< $rad") 
    ->orderByRaw('distance') 
    ->get(); 

のインスタンスにこれはPostcodeTransformersの外にロジックを抽象化することになる処理する第二の方法を返すための唯一の方法だから、モデルで始まるそのロジックを使用して新しいものを作成し、することができますする必要がありますハンドルstdClass。その後、PostcodesTransformerの代わりに新しいStdClassTransformerを入力するだけです。