2017-01-29 3 views
0

Объяснение ситуации

Я пытаюсь Геч все операции, основанные на поиске, и я хочу, чтобы включать в себя сгруппированы по запросу всех description результатов, которые были найдены, так что я могут отображать их ниже результатов.Laravel 5,3 запроса (группа по отношению)

Так, например, я ищу между двумя датами. Это хорошо работает, но я не могу использовать group_by по этим результатам, так как поле date присутствует только в таблице transactions, поэтому я не могу выполнить простой запрос descriptions.

Вопрос

Я на самом деле не имеют ни малейшего представления о том, как это сделать. Сейчас я использую следующий запрос:

$first = auth()->user()->transactions() 
     ->with('description') 
     ->where('type', 'expense') 
     ->where('date', '>=', $this->parseDate()->firstOfMonth()->format('Y-m-d')) 
     ->where('date', '<=', $this->parseDate()->lastOfMonth()->format('Y-m-d')) 
     ->get(); 
} 

$this->parseDate() на самом деле просто создает экземпляр углерода в поиске и в определенном формате.

Этот запрос отображает фактические результаты. Все это работает отлично.

Пример

Допустим есть один description называется gas и есть 5 transactions с description_id из gas. Это означает, что 5 результатов будут возвращены. Однако рядом с этими результатами я хочу вернуть grouped_by версию всех найденных описаний, считая общее число descriptions и всего amount за каждые description. И это будет выглядеть примерно так:

Gas Results: 5 Total amount: $ 542 

Я не могу просто поставить groupBy('description_id) на первоначальный запрос следующим образом:

$second = $first->groupBy('description_id'); 

Так что просто возвращает коллекцию, содержащую один элемент, который содержит оригинал сбор снова.

Любые указатели?

Таблица (Stripped)

CREATE TABLE `transactions` (
`id`, 
    `user_id`, 
    `description_id`, 
    `name`, 
    `type`, 
    `date`, 
    `amount`, 
    `created_at`, 
    `updated_at` 
) 

CREATE TABLE `descriptions` (
`id`, 
    `user_id`, 
    `name`, 
    `created_at`, 
    `updated_at` 
) 

Отношение

Description->belongsTo('Transaction'); 
Transaction->hasMany('Description'); 

ответ

0

получил то, что я хотел добиться, чтобы работать, как это:

$new_array = []; 

foreach($transactions as $transaction) 
{ 
    $new_array[] = ['name' => $transaction->description->name, 'amount' => $transaction->amount]; 
} 

$collection = collect($new_array)->groupBy('name'); 
1

Если вы получаете связанный modelsq из одной Transaction того группя не имеет смысла. У вас уже есть правильная группа.

С другой стороны, вы можете делать такие вещи, как: ->count() или ->max("columname"), чтобы получить отдельные агрегаты. Проверьте https://laravel.com/docs/5.4/eloquent#retrieving-aggregates для получения дополнительной информации.

Поскольку красноречивым конструктор запросов, по существу, свободно построитель запросов, вероятно, можно также сделать:

$first = auth()->user()->transactions() 
    ->with('description') 
    ->where('type', 'expense') 
    ->where('date', '>=', $this->parseDate()->firstOfMonth()->format('Y-m-d')) 
    ->where('date', '<=', $this->parseDate()->lastOfMonth()->format('Y-m-d')) 
    ->select("transaction.*", \DB::raw("count() count"), \DB::raw("sum(description.amount)")) 
    ->get() 

Или что-то вдоль этих линий.Это основано на https://laravel.com/docs/5.4/queries#selects

+0

Большое спасибо за ваш ответ. Не могу заставить его работать так, хотя, но я буду смотреть на него более точно, потому что это лучшее решение, чем мое. – Hardist