如何对模型上我自己的方法的结果执行 Eloquent 查询?

How do I perform Eloquent queries on results from my own method on a Model?

我有 2 个模型,一个用于 Listing,一个用于 State。 Listing 上的关系是:

return $this->belongsTo('App\State');

我在 Listing 模型上有自己的方法,可以根据距离 return 项目:

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 中,我想 return 每个项目的状态名称 return 我的结果。

如果我得到的结果是:

$listings = Listing::all();

有效,但如果我使用自定义方法则无效:

$listings = Listing::getClosest($request['lat'], $request['lng'],1000);

我尝试获取状态的方式是:

foreach ($listings as $item) {
        return $item->state->short_name;

为什么它适用于 I get all 而不是当我使用自定义方法获得结果时?

因为你输了foreign_keystate_id。你的 selectRaw 覆盖了你的 select.

记住你需要 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();
}