我有一个注册表格供用户在国会注册。
例如,如果用户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);
}
}
视图中,我想在一个表中列出注册要求:
那么,是否可以在下图中找到一张表?
正确获取此信息的必要条件是什么?我不明白如何得到这个。上图中的两个表都是相同的,唯一的区别是:
participants.index
表中all_participant
为1
的时间,这意味着需要在会议注册表中收集每个部分的信息(姓名和姓氏)参与者,所以进行注册的用户需要介绍每个参与者的姓名和姓氏。然后,每个参与者的姓名和姓氏应出现在模态中,如图像所示。congresses
表中all_participant
为0
,则每个参与者的姓名和姓氏为空(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
,以及与每个参与者关联的故障单类型。
要显示图像中的所有注册和必要信息,我不知道我所拥有的数据库结构是否允许正确获取该信息。目前,数据库看起来像这样:
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..
。
答案 0 :(得分:1)
如果您询问MySQL查询。这是查询以获取特定国会中所有注册的信息吗?
SELECT * FROM `Registrations` r
INNER JOIN Participants p on p.registration_id = r.id
WHERE congress_id = 1
答案 1 :(得分:0)
答案已根据评论中提供的信息进行了更新。
首先,您必须修复Registration
和User
类之间的关系。它使用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