是否有一种简单的解决方案,可以通过模型上的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,但是当我尝试将其应用到我的应用程序时会出错
答案 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);