Lets say we have two classes User and Group which are linked trhough a GroupUser association class. When working with transient (new) records the fastest way for adding a User and couple of Groups for it is:
<code type='php'>
<code type="php">
$user = new User();
$user->name = 'Some User';
$user->Group[0]->name = 'Some Group';
...
...
@@ -11,7 +11,7 @@ $user->save();
</code>
However in real world scenarious you often already have existing groups, where you want to add a given user. The most efficient way of doing this is:
<code type='php'>
<code type="php">
$gu = new GroupUser();
$gu->user_id = $userId;
$gu->group_id = $groupId;
...
...
@@ -22,16 +22,18 @@ $gu->save();
While the obvious and convinient way of deleting a link between User and Group would be the following, you still should *NOT* do this:
<code type='php'>
<code type="php">
$user = $conn->getTable('User')->find(5);
$user->GroupUser
->remove(0)
->remove(1);
</code>
This is due to a fact that $user->GroupUser loads all group links for given user. This can time-consuming task if user belongs to many groups. Even if the user belongs to few groups this will still execute an unnecessary SELECT statement.
The right way to delete links between many-to-many associated records is by using the DQL DELETE statement. Convenient and recommended way of using DQL DELETE is trhough the Query API.