Получить данные из нескольких таблиц Laravel

Я пытаюсь создать купонный сайт в Laravel. У каждого продавца есть свои предложения/купоны. Мне удалось распечатать предложения/купоны для продавца на их конкретных страницах.

Вот мой запрос

$deals = DB::table('deals')
    -> join ('merchants', 'deals.merchant_id', '=', 'merchants.merchant_id')
    -> where ('merchant_url_text', $merchant_url_text)
    -> get();

Все идет нормально.

Вот тут-то все и начинает усложняться.

С каждой сделкой связаны еще 2 части. Количество кликов и голосов, связанных со сделками.

Количество кликов находится в таблице под названием «клики», которая записывает каждый клик на веб-сайте. Запись клика будет иметь связанный с ней идентификатор клика. Поэтому мне нужно было бы получить количество кликов по каждой сделке.

Вторая часть - это голоса. Голоса вокруг сделки хранятся в таблице deal_votes. В таблице deal_votes есть deal_id, vote (1 или 0)

Как совместить количество кликов и голосов по сделкам для возврата в одном запросе, чтобы я мог отображать информацию в своем представлении?


person Gaurav Mehta    schedule 09.03.2016    source источник


Ответы (1)


У вас есть модели и отношения, настроенные для продавцов, сделок, купонов и кликов? Это тривиально, если вы используете модели Eloquent с отношениями, для которых документы находятся здесь: https://laravel.com/docs/5.2/eloquent-relationships

Это будет выглядеть так:

$merchant = Merchant::where('merchant_url_text', $merchant_url_text)
  ->with('deals','deals.votes','deals.clicks')
  ->first();

Функция with() добавляет всю вложенную информацию, т. е. запросы join, в один запрос.

На ваш взгляд:

@foreach($merchant->deals as $deal)

   Deal: {{$deal->name}}

   Clicks: {{count($deal->clicks)}}

   Votes: {{$deal->votes->sum('vote')}}

@endforeach
person Jeff    schedule 10.03.2016
comment
Потрясающий. Это решает проблему. Однако не будет ли этот подход включать в себя отправку большого количества данных в представление, особенно в сценариях, где, скажем, сделка имеет 10 000 голосов. Повлияет ли это на производительность, если количество голосов и кликов по каждой сделке будет огромным, а у продавца будет как минимум 100 сделок? - person Gaurav Mehta; 10.03.2016
comment
3 варианта - 1 - отправить все эти данные на ваше представление. 2 заключается в создании пользовательского атрибута voteCount, как здесь: ">softonsofa.com/ . Это приводит к 100 запросам БД, хотя в вашей ситуации. Третий вариант — запустить отдельный запрос, чтобы получить количество голосов по всем сделкам (одновременно), а затем отправить эти данные в ваше представление отдельно. - person Jeff; 10.03.2016
comment
Потрясающий. Благодарю за ваш ответ. Это действительно полезно. - person Gaurav Mehta; 10.03.2016