'How to dissociate elements from a HasMany relation?

There's the save and saveMany methods on the HasMany relation class, but where are the dissociate(Many)/detach(Many) methods? There's also no built-in way to get the inverse relationship method, so what's the best way to dissociate an array of id's/models from a HasMany relationship object.

Currently I'm using:

$hasMany = $parent->theRelationship(); // Get the relationship object.
$child = $hasMany->getRelated(); // Get an empty related model.
$key = $hasMany->getForeignKeyName(); // Get the name of the column on the child to set to NULL.
$child->findMany($IDs)->each(function($model) use ($key) {
  $model->$key = NULL;
  $model->save();
});

This could be alot shorter with something like:

$hasMany = $parent->theRelationship();
$hasMany->dissociate($IDs);

Bonus points if you have any official answers from Taylor as to why he hasn't implemented this, I've seen him close feature requests of this kind on GitHub.



Solution 1:[1]

I am not sure why there isn't a function, but to be more performant than your example, you could use the DB class like:

\DB::table('child_table')->where('parent_id', $parent->id)->update(['parent_id' => null]);

Solution 2:[2]

The performatic way (1 db update):

$partent->theRelationship()->update(['parent_id' => null]);

The readable way (multiple db updates):

$parent->theRelationship->each->parentRelationship()->dissociate();

Solution 3:[3]

You could use detach like so;

$parent->theRelationship()->detach([1,2,3])

Where you pass an array of IDs.

From Laravel documentation: "For convenience, attach and detach also accept arrays of IDs as input"

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 digout
Solution 2 Fred Vanelli
Solution 3 MyLibary