如何对自己在模型上的方法的结果执行口才查询?

时间:2019-12-15 03:49:08

标签: laravel eloquent laravel-6

我有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;

为什么我的自定义方法可以得到全部结果却不能全部显示?

1 个答案:

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