Laravel сбор заказов на основе свойства отношения "один ко многим" - PullRequest
0 голосов
/ 28 мая 2020

У меня есть модель под названием Business (с описанием столбцов, именем, представлением и т. Д. c), она имеет отношение "один ко многим" с моделью "Рейтинг". Я хочу запросить свою бизнес-модель, чтобы она возвращала результат, который проверяет, присутствует ли строка поиска в названии или описании, а также сначала сортирует по бизнесу, имеющему наивысший рейтинг, а затем просматривает его.

Я написал код поискового запроса. найдите ниже:

$business = Business::with('images')
    ->where('isActive', true)
    ->where(function ($q) use ($query) {
        $q->where('name', 'LIKE', '%' . $query . '%')
            ->orWhere('description', 'LIKE', '%' . $query . '%');
    })->get();

Я знаю, что могу получить средние оценки бизнеса следующим образом:

$averageRating = Rating::where('business_id', $id)->avg('rating');
$business = Business::with(['images'])->get();

foreach ($business as $item) {
    $item["rating"] = floor($averageRating);
}

Итак, как мне сделать заказ на основе сначала самых высоких оценок, а затем самых высоких просмотров

Ответы [ 3 ]

0 голосов
/ 28 мая 2020

Вам нужно будет использовать соединение, я считаю так:

$business = Business::select([
    'businesses.*', \DB::raw('AVG(ratings.rating) as avg_rating')
  ])
  ->join('ratings', 'businesses.id', '=', 'ratings.business_id')
  ->orderBy('ratings.avg_rating', 'DESC')
  ->get();

Не тестировалось

0 голосов
/ 28 мая 2020

вы можете использовать выборки подзапросов:

business = Business::with('images')
        ->where('isActive', true)
                    ->where(function ($q) use ($query){
                        $q->where('name', 'LIKE','%'.$query.'%')->orWhere('description', 'LIKE','%'.$query.'%');
                    })
->orderByDesc(['topRating' => Rating::select('rating')
    ->whereColumn('business_id', 'businesses.id')
    ->orderBy('rating', 'desc')
    ->limit(1)])
->get();

убедитесь, что вы указали имя бизнес-таблицы вместо «предприятий»

подробнее о выборе подзапросов в:

https://laravel.com/docs/7.x/eloquent#advanced -подзапросы

0 голосов
/ 28 мая 2020

Для этого вы должны вручную присоединиться к таблице:

$business = Business::with('images')
    ->join('rating_table', 'rating_table.business_id', '=', 'business_table.id')
    ->where('isActive', true)
    ->where(function ($q) use ($query){
        $q->where('name', 'LIKE','%'.$query.'%')
            ->orWhere('description', 'LIKE','%'.$query.'%');
    })
    ->orderBy('rating_table.value', 'DESC')
    ->get();

После многих попыток невозможно упорядочить "родителя" по их отношениям с помощью Eloquent, вы можете заказать внутри отношения, но вот и все.

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