Laravel hasMany关系分离所有

时间:2019-05-15 18:20:37

标签: laravel orm eloquent

是否有一种简单的解决方案,可以通过模型上的hasMany关系分离(不删除)所有相关模型?

例如,我有两个表:

  • 大学(id,name)

  • 学生(id,姓名,college_id(可为空))

在College模型中,我定义了这种关系:

class College extends Model
{
    public function students()
    {
        return $this->hasMany('App\Student','college_id','id');
    }
}

将所有目前的大学生从学院中分离出来的最佳方法是什么(即,让所有的大学学生并将他们的college_id设置为null)?

是否有一种简单的方法可以使所有学生脱离口才而脱离大学模式?

类似

class College extends Model
{
    ...
    public function detachAllStudents()
    {
        ...
    }
}

P.S。已经读过这个问题Laravel hasMany detach,但是当我尝试将其应用到我的应用程序时会出错

3 个答案:

答案 0 :(得分:3)

是的,您可以按如下所示分离所有大学生。实际上,我们在您的college_id表中已经有了students,并且必须以某种方式使此college_id为null。在Eloquent中这不称为分离。当您具有detach关系时,单词many to many就会出现。因此,让我们更新学生,看看它是否有效。

$college->students()->update(['college_id' => null);

因此,您的方法可以如下完成:

public function detachAllStudents()
{
    $college->students()->update(['college_id' => null]);
}

就是这样!

答案 1 :(得分:2)

直接来自文档https://laravel.com/docs/5.8/eloquent-relationships

切换关联

多对多关系还提供了一种切换方法,可以“切换”给定ID的附件状态。如果当前附加了给定的ID,它将被分离。同样,如果当前已分离,它将被附加:

$user->roles()->toggle([1, 2, 3]);

答案 2 :(得分:0)

尽管Imran的回答非常适合这种情况,但我会添加一个更通用的方法。假设$college尊重接口而非实现,您在运行时就不会知道外键。

<?php

use Illuminate\Database\Eloquent\Relations\HasMany;

interface HasStudents {
    public function students(): HasMany;
}

class College extends Model implements HasStudents
{
    public function students(): HasMany;
    {
        return $this->hasMany(Student::class, 'college_id', 'id');
    }
}

function detachStudents(HasStudents $model): void {
    $studentsRelationship = $model->students();
    $studentsRelationship->update([
        $studentsRelationship->getQualifiedForeignKeyName() => null
    ]);
}

detachStudents($college);