按相关表中的字段分组数据

时间:2019-01-11 10:53:51

标签: laravel

我有一张桌子:

Event [id,'name','areTicketsGenerated'],

门票['id',event_id','seat_price_id','isAvailable'],

SeatPrice ['id','price_zone_id']。

我需要接收所有事件。在每种情况下,我都需要计算按“ price_zone_id”分组的可用门票。

我的查询是下一个:

$events = Event::with([
    'tickets',
    'tickets.seatPrice',
  ])->where('areTicketsGenerated', true)
  ->get();
foreach($events as $event) {
   $ticketsCount = $event->tickets->where('isAvailable', true) ...
}

但是我只收到所有可用的票。

如何按“ price_zone_id”分组?

例如:

Event1

价格区1-10张门票;

价格区2-50张门票。

Event2

价格区4-20票;

价格区5-25票。

2 个答案:

答案 0 :(得分:0)

您应该尝试以下操作:

$events = Event::with([
    'tickets',
    'tickets.seatPrice' => function($query){
        $query->groupBy('price_zone_id');
    }])
  ->where('areTicketsGenerated', true)
  ->get();

更新后的答案

也使用流利的查询

use DB;

$events = DB::table('events')
          ->join('tickets', 'tickets.event_id', '=', 'events.id') 
          ->leftJoin('seat_price', 'tickets.seat_price_id', '=', 'seat_price.id')
          ->where('events.areTicketsGenerated',true)
          ->groupBy('seat_price.price_zone_id')
          ->get();

答案 1 :(得分:0)

这应该为您带来所需的所需结果:

$data = Event::join('Ticket','Event.id','Ticket.event_id')
    ->join('SeatPrice','Ticket.seat_price_id','SeatPrice.id')
    ->select('Event.id as id','price_zone_id',DB::raw('count(Ticket.*) as Total'))
    ->where('isAvailable', true)
    ->groupby('Event.id','price_zone_id')
    ->get();

$events = $data->groupBy('id')->toarray();

现在,在您的Blade中,您应该能够:

@foreach($events as $key => $event)
   {{$key}}
   @foreach($event as $item)
      {{$item['price_zone_id']}} - {{$item['Total']}}
   @endforeach
@endforeach