У меня возникают трудности при выборе определенных 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. Это профессионально не решает проблему и тратит впустую память.
Это очень похоже на этот пост , но не является дубликатом. Пожалуйста не помечайте его как таковой.