如何通过控制器将两个不同模型的值作为 Laravel 8 中的单个返回变量传递给视图文件

Posted

技术标签:

【中文标题】如何通过控制器将两个不同模型的值作为 Laravel 8 中的单个返回变量传递给视图文件【英文标题】:How to pass values from two different Models to the View file via the Controller as a single return variable in Laravel 8 【发布时间】:2021-12-21 21:35:18 【问题描述】:

我有一个约会列表,我需要在其中显示约会详细信息并在可用状态列表的另一侧突出显示当前状态

我有 2 个模型,

    获取预约详情的预约模型 AppointmentStatus模型,用于获取Appointment的当前状态(Status是存储状态表,AppointmentStatus表只与状态表有关系)

这是我的控制器功能

public function details($id ,Request $request)

    $appointment = new Appointment;
    $appointmentStatus = new AppointmentStatus;
    $eventDetail = $appointment->getEventsDetails($id);
    $status = $appointmentStatus->getCurrentStatus($id);
    $data = $eventDetail->concat($status);
    return $data;


$eventDetail 包含约会的所有详细信息,在$status 中,我得到了约会的当前状态。现在我对如何将这两个变量传递给一个需要打印的视图文件有疑问。

getCurrentStatus 函数

 public function getCurrentStatus($id)

    $status = DB::table("appointment_status_tbl")
        ->join("booking_status_tbl", function($join)
            $join->on("appointment_status_tbl.booking_status_id", "=", "booking_status_tbl.id");
        )
        ->select(
            "booking_status_tbl.booking_status",
            )
        ->where('appointment_status_tbl.appointment_id', '=', $id)
        ->get();
        return view('/detail',compact('status'));

getEventDetails函数

public function getEventsDetails($id)
    $getdata = DB::table("appointments_tbl")
        ->join("patients_tbl", function($join)
            $join->on("appointments_tbl.patient_id", "=", "patients_tbl.id");
        )
        ->join("doctors_tbl", function($join)
            $join->on("appointments_tbl.doctor_id", "=", "doctors_tbl.id");
        )
        ->join("payment_tbl", function($join)
            $join->on("appointments_tbl.payment_id", "=", "payment_tbl.id");
        )
        ->join("treatment_category", function($join)
            $join->on("appointments_tbl.treatment_category", "=", "treatment_category.id");
        )
        ->join("treatment_options", function($join)
            $join->on("appointments_tbl.treatment_option", "=", "treatment_options.id");
        )
        ->select(
            "appointments_tbl.id",
            "appointments_tbl.start_time",
            "appointments_tbl.end_time",
            "patients_tbl.status",
            "patients_tbl.first_name",
            "patients_tbl.last_name",
            "appointments_tbl.patient_id",
            "patients_tbl.phone",
            "patients_tbl.email",
            "patients_tbl.address",
            "patients_tbl.city",
            "patients_tbl.dob",
            "patients_tbl.postal_code",
            "doctors_tbl.doctor_name",
            "treatment_category.category_name",
            "treatment_options.treatment_name",
            "payment_tbl.payment_status",
            "appointments_tbl.covid_19_symptoms"
        )
        ->where('appointments_tbl.id', '=', $id)
        ->get();
        foreach ($getdata as $values) 
            $id = $values->id;
            $patientID = $values->patient_id;
            $start_date = $values->start_time;
            $upcoming = DB::table("appointments_tbl")
                ->join("treatment_options", function($join)
                    $join->on("appointments_tbl.treatment_option", "=", "treatment_options.id");
                )
                ->select(
                    "appointments_tbl.id",
                    "treatment_options.treatment_name",
                    "appointments_tbl.start_time",
                    )
                ->where('appointments_tbl.patient_id', '=', $patientID)
                ->where('start_time', '>', $start_date)
                ->get();

            $previous = DB::table("appointments_tbl")
                ->join("treatment_options", function($join)
                    $join->on("appointments_tbl.treatment_option", "=", "treatment_options.id");
                )
                ->select(
                    "appointments_tbl.id",
                    "treatment_options.treatment_name",
                    "appointments_tbl.start_time",
                    )
                ->where('appointments_tbl.patient_id', '=', $patientID)
                ->where('start_time', '<', $start_date)
                ->get();
        
    
        return view('/detail',compact('getdata','upcoming','previous'));

我尝试了concat(),但它返回以下错误:

请帮我解决问题..

谢谢!

【问题讨论】:

getEventDetailsgetCurrentStatus 函数是否返回视图? 如果我 Wright return getEventDetails; 事件详细信息将成功显示,如果我 Wright 第二个,它将成功返回,但我需要两者 通常从函数中返回集合,然后通过返回视图来结束控制器操作。在这种情况下,您可以将 2 个变量传递给视图。您不能返回 2 个视图或合并 2 个视图 这只是一个单一的视图文件,但我需要通过一个控制器从不同的模型返回 2 个不同的数据。我可以通过其中任何一个。但是如何同时通过呢? 可以分享这两个功能吗?错误说$eventDealvariable 包含一个视图对象。 【参考方案1】:

你的函数应该只返回数据:

return compact('getdata','upcoming','previous');

其他函数也一样,然后合并 2 个数组并在控制器中返回一个视图。

$data = array_merge($eventDetail, $status);
return view('detail', $data); 

检查您的视图名称,通常它们不以 / 开头

【讨论】:

以上是关于如何通过控制器将两个不同模型的值作为 Laravel 8 中的单个返回变量传递给视图文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将不同的值传递给管道参数

如何使用 jquery ajax 将 web api 控制器中的 web 表单值作为模型类传递

ASP.NET MVC 视图需要将选定的下拉列表和日历日期传递给模型

如何在TensorFlow中向CNN输入多个序列?

使 Laravel 模型使用复杂查询作为表

将数组从 AuthController 传递到 Laravel 5 中的登录视图