Как правильно получить информацию обо всех регистрациях на конкретном конгрессе? - PullRequest
0 голосов
/ 07 мая 2018

У меня есть регистрационная форма для регистрации пользователя на конгрессе.

Например, если пользователь Джон регистрируется в конгрессе и регистрируется с двумя участниками (им и его коллегой Джейком), а Джон регистрирует его в виде билета 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 представлении я хочу перечислить в таблице регистрацию:

  1. всех пользователей, которые зарегистрировались на этом конкретном конгрессе;
  2. количество приобретенных ими билетов;
  3. типы билетов; и
  4. Статус регистрации (Завершено, Не завершено).

Итак, возможно ли иметь таблицу на следующем рисунке?

enter image description here

Что необходимо для правильного получения этой информации? Я не понимаю, как это получить. Обе таблицы на изображении выше одинаковы, единственное отличие:

  • первая часть изображения - это когда 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, а также тип заявки, связанный с каждым участником.

Чтобы показать все регистрации и необходимую информацию, как на картинке, я не знаю, позволяет ли имеющаяся у меня структура базы данных правильно получать эту информацию. На данный момент база данных выглядит так:

enter image description here

Модели 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...

enter image description here

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Если вы спрашиваете о запросе MySQL. Это запрос для получения информации обо всех регистрациях на определенном конгрессе?

SELECT * FROM `Registrations` r
INNER JOIN Participants p on p.registration_id = r.id
WHERE congress_id = 1
0 голосов
/ 16 мая 2018

Ответ был обновлен на основе информации, предоставленной в комментариях.

Во-первых, вы должны исправить связь между Registration и User классом. Он использует имя столбца по умолчанию , но ваша схема использует другой:

class Registration extends Model
{

    // ...

    public function customer()
    {
        return $this->belongsTo('App\User', 'main_participant_id');
    }

    // ...

}

Если у вас есть доступ для этого, я бы предложил вам изменить имя этого столбца на что-то более понятное. Текущее имя принимает одно, чтобы предположить, что оно ссылается на таблицу participants.

С этим фиксированным отношением вы теперь можете получить основного участника, вызвав его магическое свойство. Это вернет User экземпляр модели:

$registration->customer;

Дополнительно, вы должны добавить связь между участниками и типами билетов в ваш Participant класс:

class Participant extends Model
{

    // ...

    public function ticketType()
    {
        return $this->belongsTo('App\TicketType');
    }

    // ...

}

Это отношение позволит вам получить информацию о типе заявки, включая ее имя, из любого экземпляра модели участника.

Тогда, в представлении, вы сможете сделать следующее:

<table>
    <tr>
        @foreach ($congress->registrations as $registration)

            <!-- User that did the registration -->
            <td>{{ $registration->customer->name }}</td>

            <!-- Email.
                 Although, I don't see an email field in your DB schema -->
            <td>{{ $registration->customer->email }}</td>

            <!-- Ticket types -->
            <td>
                {{
                    $registration->participants
                        ->map(function ($participant) {
                            return $participant->ticket_type->name;
                        })
                        ->implode(', ')
                }}
            </td>

            <!-- Quantity -->
            <td>{{ $registration->participants->count() }}</td>

            <!-- Status -->
            <td>{{ $registration->status === 'C' ? 'Confirmed' : 'Waiting' }}</td>

            <!-- Date. Considering a Carbon instance.
                 Although, I don't see a created_at field in your DB schema -->
            <td>{{ $registration->created_at->format('m/d/y') }}</td>

        @endforeach
    </tr>
</table>

Как видите, я использовал "хитрость", чтобы получить все типы в одной цепочке методов. Это возможно, потому что результаты Eloquent, за исключением случаев, когда возвращается один экземпляр и другие особые случаи, обычно составляют Collection с. Вы можете узнать больше о коллекциях Eloquent и доступных методах на Laravel docs . Также обратите внимание на мои комментарии выше по пропущенным полям.

Наконец, для второго просмотра вы можете перебрать всех участников определенной регистрации:

<!-- User that did the registration -->
<dl>
    <dt>Name</dt>
    <dd>{{ $registration->customer->name }}</dd>
    <dt>Email</dt>
    <dd>{{ $registration->customer->email }}</dd>
</dl>

@foreach ($registration->participants as $participant)

    <!-- Participant N -->
    <dl>
        <dt>Name</dt>
        <dd>{{ $participant->name }}</dd>
        <dt>Surname</dt>
        <dd>{{ $participant->surname }}</dd>
        <dt>Ticket Type</dt>
        <dd>tt{{ $participant->ticket_type_id }}</dd>
    </dl>

@endforeach
0 голосов
/ 11 мая 2018

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

class ParticipantController extends Controller
{
    public function index(Congress $congress) {
        return view('participants.index')->with('congress', $congress->load('registrations.participants');
    }
}

Вид:

<tr>
    <th>User that did the registration</th>
    <th>Quantity</th>
    <th>Status</th>
</tr>

@foreach($congress->registrations as $registration)
    <tr>
        <td>{{ $registration->participants->where('ticket_type_id', $congress->main_participant_id)->first()->name }}</td>
        <td>{{ $registration->participants->count() }}</td>
        <td>{{ $registration->status === 'C' ? 'Complete' : 'Incomplete' }}</td>
    </tr>
@endforeach

Часть этой логики представления, вероятно, принадлежит модели или декоратору.

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