如何正确获取特定国会中所有注册的信息?

时间:2018-05-07 16:45:25

标签: php laravel eloquent

我有一个注册表格供用户在国会注册。

例如,如果用户John正在国会中进行注册,并且有2名参与者(他和他的同事Jake)注册,而John正在机票类型tt1注册他,并且在机票类型中注册Jake {数据库中的{1}}在“注册”表中插入一个条目,用于存储哪个用户进行了注册以及在哪个会议中进行了注册。然后,它还在参与者表中插入由进行注册的用户(main_participant)的每个注册参与者的条目。所以表格保持如下:

tt2表格

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); } } 视图中,我想在一个表中列出注册要求:

  1. 在此特定大会上进行注册的所有用户;
  2. 他们获得的门票数量;
  3. 门票类型;和
  4. 注册状态(完整,不完整)。
  5. 那么,是否可以在下图中找到一张表?

    enter image description here

    正确获取此信息的必要条件是什么?我不明白如何得到这个。上图中的两个表都是相同的,唯一的区别是:

    • 图片的第一部分是participants.index表中all_participant1的时间,这意味着需要在会议注册表中收集每个部分的信息(姓名和姓氏)参与者,所以进行注册的用户需要介绍每个参与者的姓名和姓氏。然后,每个参与者的姓名和姓氏应出现在模态中,如图像所示。
    • 如果congresses表中all_participant0,则每个参与者的姓名和姓氏为空(congresses)。这是因为在注册表中没有必要收集每个参与者的信息。

    与表格中的故障单类型列相关:用户可以向多个参与者进行注册。例如,John可以选择2个ticekts,其中一个是故障单类型'',另一个是故障单类型tt1。如果注册包含一种或多种故障单类型,则应在故障单类型列中显示与该特定注册相关联的故障单类型,如上图中第一次注册(对于用户John) W)。

    将此代码放在tt2

    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,以及与每个参与者关联的故障单类型。

    要显示图像中的所有注册和必要信息,我不知道我所拥有的数据库结构是否允许正确获取该信息。目前,数据库看起来像这样:

    enter image description here

    Laravel模特:

    0

    最后,故障单类型可能包含与之关联的自定义问题。例如,在下图中,两种故障单类型// 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的电话是+,参与者2的电话是002..

    enter image description here

2 个答案:

答案 0 :(得分:1)

如果您询问MySQL查询。这是查询以获取特定国会中所有注册的信息吗?

SELECT * FROM `Registrations` r
INNER JOIN Participants p on p.registration_id = r.id
WHERE congress_id = 1

答案 1 :(得分:0)

答案已根据评论中提供的信息进行了更新。

首先,您必须修复RegistrationUser类之间的关系。它使用default column naming,但您的架构使用不同的架构:

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 s。您可以在Laravel docs上了解有关Eloquent馆藏和可用方法的更多信息。另外,请注意我上面关于缺少字段的评论。

最后,对于第二个视图,您可以遍历特定注册的所有参与者:

<!-- 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