Выбор Specifi c, столбцы с областью видимости в закрытии с () с помощью Eloquent & Laravel 6 - PullRequest
0 голосов
/ 08 марта 2020

У меня возникают трудности при выборе определенных c столбцов, которые я также определяю с помощью встроенного в Laravel ORM: Eloquent.

Рассмотрим следующий запрос:

$query = Post::select(
    'id',
    'title' // This way works great.
)->with([
    'user:id,name,address_id', // So does this way.
    'user.address' => function ($query) use ($lat, $lon, $distance) {
        $query->distance($lat, $lon, $distance);
    }
]);

Я могу явно выбрать из столбцов как конкретную модель Post, так и модель User. Однако введение запроса scope для присоединения и выбора Address усложняет ситуацию.

with([
    'user.address' => function ($query) use ($lat, $lon, $distance) {
        $query->distance($lat, $lon, $distance); // This doesn't play nice.
    }
]

Я пробовал все варианты:

$query->select('col_name')->distance($lat, $lon, $distance);
$query->distance($lat, $lon, $distance)->select('col_name');

$query->pluck('col_name')->distance($lat, $lon, $distance);
$query->distance($lat, $lon, $distance)->pluck('col_name');

$query->value('col_name')->distance($lat, $lon, $distance);
$query->distance($lat, $lon, $distance)->value('col_name');

После обыскивая этот веб-сайт - и другие - часами.

Вот функция области видимости для полноты:

public function scopeDistance($query, $lat, $lng, $radius = 100, $unit = "km")
{
    $unit = ($unit === "km") ? 6378.10 : 3963.17;
    $lat = (float)$lat;
    $lng = (float)$lng;
    $radius = (double)$radius;
    return $query->select(DB::raw("*,
                        ($unit * ACOS(COS(RADIANS($lat))
                            * COS(RADIANS(latitude))
                            * COS(RADIANS($lng) - RADIANS(longitude))
                            + SIN(RADIANS($lat))
                            * SIN(RADIANS(latitude)))) AS distance"))
        ->having('distance', '<=', $radius)
        ->orderBy('distance', 'asc');
}

Определение объема обычно принадлежит whereHas(...) вызовам построителя запросов. Однако такое использование области действия просто добавляет вычисляемый столбец с псевдонимом distance к возвращаемым результатам.

Пожалуйста, порекомендуйте решения, которые сохраняют мою способность делать это. Пожалуйста, не рекомендуем выбирать все, а затем фильтровать результаты, используя функцию сериализации Laravel. Это профессионально не решает проблему и тратит впустую память.

Это очень похоже на этот пост , но не является дубликатом. Пожалуйста не помечайте его как таковой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...