У меня есть регистрационная форма для регистрации пользователя на конгрессе.
Например, если пользователь Джон регистрируется в конгрессе и регистрируется с двумя участниками (им и его коллегой Джейком), а Джон регистрирует его в виде билета tt1
, а Джейк в виде билета tt2
в базу данных вставляется запись в таблице «Регистрации», в которой хранится информация о том, какой пользователь сделал регистрацию и в каком конгрессе. Затем он также вставляет в таблицу участников запись для каждого зарегистрированного участника пользователем, который выполнил регистрацию (main_participant). Таким образом, таблицы остаются как:
registrations
таблица
id | status | congress_id | main_participant_id
---+--------+-------------+--------------------
7 | C | 1 | 1
participants
таблица
id | registration_id | ticket_type_id | name | surname
---+-----------------+----------------+------+--------
12 | 7 | 1 | John | W
13 | 7 | 2 | Jake | Y
Теперь у меня есть ParticipantController
, который имеет метод index
, который получает информацию о конкретном Congress
:
class ParticipantController extends Controller
{
public function index($id)
{
$congress = Congress::find($id);
return view('participants.index')->with('congress', $congress);
}
}
В этом participants.index
представлении я хочу перечислить в таблице регистрацию:
- всех пользователей, которые зарегистрировались на этом конкретном конгрессе;
- количество приобретенных ими билетов;
- типы билетов; и
- Статус регистрации (Завершено, Не завершено).
Итак, возможно ли иметь таблицу на следующем рисунке?
Что необходимо для правильного получения этой информации? Я не понимаю, как это получить. Обе таблицы на изображении выше одинаковы, единственное отличие:
- первая часть изображения - это когда
all_participant
равно 1
в таблице congresses
, что означает, что в форме регистрации на конгресс необходимо было собрать информацию (имя и фамилию) каждого участника, поэтому пользователь сделал регистрацию, необходимую для введения имени и фамилии каждого участника. Затем имя и фамилия каждого участника должны появиться в модале, как на картинке.
- в случае, когда
all_participant
равно 0
в таблице congresses
, имя и фамилия каждого участника не заполнены (''
). Это потому, что в регистрационной форме не было необходимости собирать информацию о каждом участнике.
Относится к столбцу Типы билетов в таблице: пользователь может зарегистрироваться с несколькими участниками. Например, Джон может выбрать 2 квитанции: один тип билета tt1
и другой тип билета tt2
. Если регистрация включает 1 или более типов билетов, она должна появиться в столбце Типы билетов типов заявок, связанных с этой конкретной регистрацией, как показано на рисунке выше для первой регистрации (для пользователя John W ).
С этим кодом в ParticipantController
:
$allRegistrations = $congress->registrations()->get();
А потом в представлении:
@foreach ($allRegistrations as $r)
{{ $r }}
@endforeach
Я получил:
{"id":10,"status":"C","congress_id":1,"main_participant_id":1}
Статус можно получить как {{ $r->status }}
. Но как получить другую необходимую информацию, которая находится на изображении? Количество, типы билетов и имя пользователя, который сделал регистрацию? И информация в модале: имя и фамилия каждого участника или шоу ""
, если all_participant
равно 0
, а также тип заявки, связанный с каждым участником.
Чтобы показать все регистрации и необходимую информацию, как на картинке, я не знаю, позволяет ли имеющаяся у меня структура базы данных правильно получать эту информацию. На данный момент база данных выглядит так:
Модели Laravel:
// Congress model
class Congress extends Model
{
// A conference has one creator
public function creator(){
return $this->belongsTo('App\User', 'user_id');
}
public function ticketTypes(){
return $this->hasMany('App\TicketType', 'congress_id');
}
public function registrations(){
return $this->hasMany('App\Registration', 'congress_id');
}
}
// User model
class User extends Authenticatable
{
public function congresses(){
return $this->hasMany('App\Congress', 'user_id');
}
// A user can register in many conferences
public function registrations(){
return $this->hasMany('App\Registration','main_participant_id');
}
}
// Registration model
class Registration extends Model
{
// a registration has one user that do the registration
public function customer(){
return $this->belongsTo('App\User');
}
// a registration can have many participants
public function participants(){
return $this->hasMany('App\Participant');
}
public function congress(){
return $this->belongsTo('App\Congress');
}
}
// Participant Model
class Participant extends Model
{
// a participant belongs to a registration
public function registration(){
return $this->belongsTo('App\Registration');
}
}
// Ticket Type model
class TicketType extends Model
{
public function congress(){
return $this->belongsTo('App\Congress');
}
public function questions(){
return $this->belongsToMany('App\Question', 'ticket_type_questions')->withPivot(['required']);;
}
}
// Question model
class Question extends Model
{
public function ticket_type(){
return $this->belongsToMany('App\TicketType', 'ticket_type_questions')
->withPivot('required');
}
}
// Answer model
class Answer extends Model
{
public function question(){
return $this->belongsTo('Question');
}
public function participant(){
return $this->belongsTo('Participant');
}
}
// TicketTypeQuestion model
class TicketTypeQuestion extends Model
{
}
Наконец, с типом заявки могут быть связаны пользовательские вопросы. Например, на изображении ниже оба типа билетов tt1
и tt2
имеют пользовательский вопрос «Какой у вас телефон?» , связанный с ними. В этом случае ответы на эти вопросы, на которые отвечает использование, выполнившее регистрацию, должны появиться в модальном режиме, когда пользователь нажимает на +
, чтобы увидеть подробности. Как получить эти ответы? В этом примере изображения телефон участника 1 - 002..
, а телефон участника 2 - 003..
.