首页 > 解决方案 > Laravel 表单提交关系

问题描述

在我的应用程序中,我有很多表格。表单是它自己的实体,具有自己的属性。当用户填写并提交表单时,会为该表单创建提交。因此,一个表单有许多提交,而一个提交属于一个表单。然而......正如我刚才提到的,提交不是它自己的实体,而是许多子实体的抽象父实体。这是一个图表:

UMD图

因此,假设用户填写了“联系我们”表格。保存后,将创建一个 ContactUs 模型。

我希望能够查询特定表单的所有提交。IE。Form::where('name', 'Contact Us')->first()->submissions;此查询应返回 ContactUs 模型的集合。同样,Form::where('name', 'Submit a Problem')->first()->submissions;应该返回 SubmitProblem 模型的集合。我将如何设置我的模型/关系来查询这​​个?

目前,我将 form_id 存储在每个提交模型中。这并不理想,因为它是重复的,我的 Submission 模型不应该跟上它的 Form id。

更新: 这是我认为我的表结构应该如下所示的 ERD: ERD

根据我在 laravel 文档上阅读的内容,这看起来像是一对多的多态关系。但是,我不知道如何使用中间表设置这种关系。

我的模型:

class Form extends Model
{
    public function submissions()
    {
         return $this->morphMany('submittable');
    }
}

class ContactUs extends Model
{
    public function form()
    {
         return $this->morphTo('submittable');
    }
}

class SubmitProblem extends Model
{
    public function form()
    {
         return $this->morphTo('submittable');
    }
}

标签: phpmysqllaravelentity-relationship

解决方案


表格将具有以下结构/列

//forms table
 - id
 - name
 - description
 - submittable_id
 - submittable_type
 - created_at
 - updated_at
class Form extends Model
{
    public function submissions()
    {
         return $this->morphTo('submittable');
    }
}

class ContactUs extends Model
{
    public function form()
    {
         return $this->morphOne(Form::class, 'submittable');
    }
}

class SubmitProblem extends Model
{
    public function form()
    {
         return $this->morphOne(Form::class, 'submittable');
    }
}

查询可以

//Get Contact Us related forms
$contactUsForms = Form::with('submittable')
    ->where('submittable_type', 'App\Models\ContactUs')
    ->get();


//Get all SubmitProblem related forms
$submitAProblemForms = Form::with('submittable')
    ->where('submittable_type', 'App\Models\SubmitProblem')
    ->get();

推荐阅读