【问题标题】:How to build a quaternary relationship in laravel 6?如何在 laravel 6 中建立四元关系?
【发布时间】:2020-01-18 06:55:23
【问题描述】:

我必须在这些表之间创建一个关系:

如您所见,我需要关联 4 个表来创建四元关系,假设数据库模型没问题,我该如何使用 eloquent 来建立关系?

在模型中主题

public function curs_academic(){ // as academic year
        return $this->belongsToMany('App\Curs_academic', 'assignatura_alumne_curs_professor', 'id_assignatura', 'id_curs_academic');
    }
    public function user(){ //as teacher
        return $this->belongsToMany('App\User', 'assignatura_alumne_curs_professor', 'id_assignatura', 'id_usuari');
    }

学生失踪了,因为我连三元都做不到..

当我保存时,我会这样做:

public function update(Request $request, $id)
    {
        $this->validate($request,[
            'nom'=> 'required',
        ]);
        $assignatura = Assignatura::find($id);
        $assignatura->nom = $request->input('nom');
        $assignatura->save();
        $assignatura->estudi()->associate($request->estudis);
        $assignatura->curs_academic()->sync($request->curs_academic,false);
        $assignatura->user()->sync($request->professors,false);
        $assignatura->save();
        return redirect('/assignatures')->with('success','Assignatura modificada');

    }

pd:数据库模型可以改变,我试图撤消四元关系,但没有它就没有意义(对我来说)。

表单输入:

<div class="form-group col-lg-6">
                      {!! Form::label('curs_academic', 'Curs academic') !!}
                      {!! Form::select('curs_academic[]', $cursos_academics, $assignatura->curs_academic()->pluck('curs_academics.id'), ['id' => 'curs_academic','multiple' => 'multiple', 'class' => 'selectpicker', 'data-live-search' => 'true']) !!}
                    </div>
                    <div class="form-group col-lg-6">
                      {!! Form::label('professor', 'Professor') !!}
                      {!! Form::select('professors[]', $professors, $assignatura->user()->pluck('users.id'), ['id' => 'professors','multiple' => 'multiple', 'class' => 'selectpicker', 'data-live-search' => 'true']) !!}
                    </div>

目标表:

主题 - 学生 - 年份 - 教师。 数学 - 伊万 - 2019 - 大卫。 // 数学 - 伊万 - 2018 - 大卫。

【问题讨论】:

  • 您的问题到底是什么?如果您为每个关系创建单独的模型,我看不出有什么问题?
  • @Olivenbaum 嗯,我不知道要同步数据,它是链式同步的,这会在数据库中创建重复值
  • $request-&gt;estudis$request-&gt;curs_academic$request-&gt;professors 的值是多少?
  • 所有 3 个都是 id 数组。 $request->estudis (mean subject) [1,2,3] -> 3 个科目的 id,与其他科目相同。 $request->curs_academic(平均学年)$request->professors(平均教师)
  • 数组的内容是什么?请提供表单中的示例输入。

标签: php sql laravel eloquent laravel-6


【解决方案1】:

您最终会得到重复的条目,因为您对一个表使用了多个关系。

尝试使用pivot fields 仅调用一次sync()

这是因为 Laravel 不可能知道您的数据透视表中已经存在的另一条记录,因为它只在特定关系方法中查找键。

一个好的方法是为数据透视表创建一个中间模型并且只使用BelongsToHasMany 关系。然后管理关联变得非常简单。

【讨论】:

  • 什么意思?为每个类创建一个中间模型?或为数据透视表创建模型?对不起,这是我的第一个 laravel 项目..
  • 为数据透视表创建一个模型。然后您可以使用associate() 更新所有其他关系,而不必处理复杂的数据透视字段。由于您的数据透视表已经有一个 id 列,这应该没问题。只需将数据透视表视为另一个常规表,其具有与您的其他表相关的正常模型。
  • 但是这样做,如果我没记错的话,我在问题中添加的表格将不起作用,我的意思是,这一年会很好,但另一个曾经没有。它不会充当四元......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2015-01-20
  • 1970-01-01
  • 2021-12-17
  • 2020-06-28
  • 2020-08-28
相关资源
最近更新 更多