我有2种模型,分别用于列表和状态模型。清单上的关系是:
return $this->belongsTo('App\State');
我在Listing模型上有自己的方法,可以根据距离返回项目:
public static function getClosest($lat, $lng, $distance)
{
$results = Listing::select('id', 'name', 'address', 'suburb',
'postcode', 'phone', 'url')
->selectRaw('( 6371 * acos( cos( radians(?) ) *
cos( radians( ST_X(position) ) )
* cos( radians( ST_Y(position) ) - radians(?)
) + sin( radians(?) ) *
sin( radians( ST_X(position) ) ) )
) AS distance', [$lat, $lng, $lat])
->havingRaw("distance < ?", [$distance])
->orderBy('distance', 'asc')
->get();
return collect($results);
}
在我的ListingController中,我想返回结果返回的每个项目的状态名称。
如果我得到的结果是:
$listings = Listing::all();
它有效,但是如果我使用自定义方法,则不会:
$listings = Listing::getClosest($request['lat'], $request['lng'],1000);
我试图获得状态的方式是:
foreach ($listings as $item) {
return $item->state->short_name;
为什么我的自定义方法可以得到全部结果却不能全部显示?
答案 0 :(得分:1)
因为您丢失了Foreign_key state_id。并且您的selectRaw
遮盖了您的select
。
请记住,您需要选择foreign_key(state_id)
,以便laravel可以找到其关系。
尝试这样做:
public static function getClosest($lat, $lng, $distance)
{
return Listing::select(\DB::raw('( 6371 * acos( cos( radians(?) ) *
cos( radians( ST_X(position) ) )
* cos( radians( ST_Y(position) ) - radians(?)
) + sin( radians(?) ) *
sin( radians( ST_X(position) ) ) )
) AS distance', [$lat, $lng, $lat]),
'id', 'name', 'address', 'suburb', 'postcode', 'phone', 'url','name', 'state_id')
->havingRaw("distance < ?", [$distance])
->orderBy('distance', 'asc')
->get();
}