Есть ли простое решение для отсоединения (без удаления) всех связанных моделей через отношение hasMany к модели?
Например, у меня есть две таблицы:
Колледж (идентификатор, название)
Студент (id, имя, College_id(nullable))
В модели колледжа я определяю эту связь:
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 имеет много отсоединений, но получаю ошибки, когда пытаюсь применить его к своему приложению
Нет, dissociate() работает только для отношений hasOne.






Непосредственно из документации https://laravel.com/docs/5.8/eloquent-relationships:
Переключение ассоциаций
Связь «многие ко многим» также предоставляет метод переключения, который «переключает» статус вложения для заданных идентификаторов. Если данный идентификатор в настоящее время прикреплен, он будет отсоединен. Точно так же, если он в настоящее время отсоединен, он будет присоединен:
$user->roles()->toggle([1, 2, 3]);
Спасибо за ответ, но вызов $this->students()->toggle([1]);; в классе Model вызывает «Вызов неопределенного метода Illuminate\Database\Eloquent\Relations\HasMany::toggle()
Я думал, что у вас отношение «многие ко многим», потому что вы использовали слово «отсоединиться». Увидел, что Имран успешно ответил на ваш вопрос, уловив эту разницу в терминологии.
Да, вы можете отсоединить всех студентов колледжа, как показано ниже. На самом деле, у нас уже есть college_id в вашей students таблице, и мы должны каким-то образом сделать это college_id нулевым. В Eloquent это не называется отсоединением. Слово detach приходит, когда у вас есть many to many отношения. Итак, давайте просто обновим студентов и посмотрим, работает это или нет.
$college->students()->update(['college_id' => null);
Итак, ваш метод может быть завершен, как показано ниже:
public function detachAllStudents()
{
$college->students()->update(['college_id' => null]);
}
Вот и все!
Спасибо за ответ, но вызов $this->students()->detach(); в классе Model вызывает «Вызов неопределенного метода Illuminate\Database\Eloquent\Relations\HasMany::detach()»
Извините, вы сказали отсоединиться, поэтому я подумал, что это много ко многим отношениям. На самом деле у вас есть отношение один ко многим. В этом случае мы должны использовать метод update(). Я обновил ответ. Пожалуйста, проверьте и посмотрите, работает ли он.
Да, это правильный ответ, наконец-то появилось умное однострочное решение, спасибо!)
Несмотря на то, что ответ Имрана идеально подходит для этого сценария, я бы добавил более общий подход. Допустим, $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);
отсоединить от многих ко многим, я думаю, вам нужно использовать dissociate()