1
0
mirror of synced 2024-12-14 07:06:04 +03:00
This commit is contained in:
zYne 2007-08-06 19:42:58 +00:00
parent 1de19626df
commit a58bec12a4

View File

@ -2,7 +2,7 @@
++ Many-to-Many relations ++ Many-to-Many relations
+++ Creating a new link +++ Creating a new link
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: 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 = new User();
$user->name = 'Some User'; $user->name = 'Some User';
$user->Group[0]->name = 'Some Group'; $user->Group[0]->name = 'Some Group';
@ -11,7 +11,7 @@ $user->save();
</code> </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: 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 = new GroupUser();
$gu->user_id = $userId; $gu->user_id = $userId;
$gu->group_id = $groupId; $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: 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 = $conn->getTable('User')->find(5);
$user->GroupUser $user->GroupUser
->remove(0) ->remove(0)
->remove(1); ->remove(1);
</code> </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. 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.
<code type='php'> <code type="php">
$deleted = Doctrine_Query::create() $deleted = Doctrine_Query::create()
->delete() ->delete()
->from('GroupUser') ->from('GroupUser')