如何实现这个复杂的查询? (当用户单击“下载证书”时获取证书的内容)

时间:2018-07-18 13:11:04

标签: laravel

我不确定如何进行复杂的查询以获取与注册关联的证书内容。可以更好地解释上下文的示例:

例如,用户Jake在会议“会议测试1”中向两个参与者(他和约翰)进行了注册。 “会议测试1”具有两种票证/注册类型(rtype1和rtype 2),并且两种注册类型都是免费的。

在注册中,用户Jake为他选择了注册类型“ rtype1”,为John选择了注册类型“ rtype2”。

因此,在杰克填写注册表之后,单击“注册”,数据库内容将保持如下所示。

数据库内容:

会议桌:

id   name                        ...
1   Conference test 1

Registration_types表:

id     name     conference_id      certificate_id      certificate_available     price
1      rtyp1          1               1                         Y                   0
2      rtype2         1               1                         Y                    0

证书表:

id    content
1   <p>abbb<img src="https://proj.test/img/image_100.jpeg" width="1200" height="900" /></p>

注册表:

id      conference_id        user_that_did_registration
1           1                            1

参与者表:

id    registration_id       registartion_type_id       name   
1          1                         1                 Jake     
2          1                         2                 John

然后,我有一个页面,列出了用户在会议中的所有注册(过去和以后的注册)。如果有与用户注册的注册类型相关的证书,我将显示一个链接“下载证书”:

 @foreach($nextRegistrations as $nextRegistration)
    @foreach($nextRegistration->participants as $participant)
    ....
    @if ($participant->registration_type->certificate_available == 'Y')
        <a href="{{route('conferences.certificateDownload',[ 'regID'=> $nextRegistration->id])}}"> Download Certificate</a>
    @endif
    @endforeach
@endforeach

我有路线:

Route::get('/certificateDownload/{regID}', [
    'uses' => 'RegistrationController@downloadCertificates',
    'as'   =>'conferences.certificateDownload'
]);

疑问:

我的疑问是,当用户单击“下载证书”时如何正确获取downloadCertificates()中的证书内容。因为对于进行每次注册都是必要的,例如,在上面的示例中,对于每次进行$nextRegistration,如果与每个参与者相关联的registration_type在每个参与者中具有“ Y”,则下载具有与该注册相关联的每个参与者的证书内容的PDF certificate_available字段(Y表示证书可用)。

我不理解查询该如何获取与注册关联的证书的信息。您可以帮助您了解如何实现此查询吗?我的操作如下,但无法正常工作,只是获取每个注册的信息。

public function downloadCertificates($regID)
    {
        //$certificatesOfRegistration = Registration::with('conference.registrationTypes.participants')->find($regID);

        //$pdf = app()->make('dompdf.wrapper');
        //pdf->loadHTML($certificateContent);
        //return $pdf->download('certificates.pdf');
    }

1 个答案:

答案 0 :(得分:0)

在讨论中讨论完之后,我想知道您想要的是以下内容:

$regId = 123; // your registration id

$participants = Participant::where('registration_id', $regId)
    ->whereHas('registration_type', function ($query) {
        $query->where('certificate_available', 'Y');
    })
    ->with('registration_type.certificate')
    ->get();

编辑:,其中包含新信息,即我们希望每位参与者一个证书(如果有),我们现在应该使用类似以下的内容

foreach ($participants as $participant) {
    $certificate = $participant->registration_type->certificate;
}

这将为您提供参与者列表,其中包含证书随附的注册类型。仅加载具有可用证书的参与者。您可以这样访问证书:

Response.sendTemporaryRedirect