96 lines
3.0 KiB
Plaintext
96 lines
3.0 KiB
Plaintext
+++ Creating related records
|
|
|
|
Accessing related records in Doctrine is easy: you can use exactly the same getters and setters as for the record properties.
|
|
|
|
You can use any of the three ways above, however the last one is the recommended one for array portability purposes.
|
|
|
|
<code type="php">
|
|
$user->Email;
|
|
|
|
$user->get('Email');
|
|
|
|
$user['Email'];
|
|
</code>
|
|
|
|
When accessing a one-to-one related record that doesn't exist, Doctrine automatically creates the object. So for example the following code is possible:
|
|
|
|
<code type="php">
|
|
$user = new User();
|
|
$user->name = 'some user';
|
|
|
|
$user->Email->address = 'some@one.info';
|
|
// saves the user and the associated email
|
|
$user->save();
|
|
</code>
|
|
|
|
When accessing one-to-many related records, Doctrine creates a Doctrine_Collection for the related component. Lets say we have users and phonenumbers and their relation is one-to-many. You can add phonenumbers easily as shown above:
|
|
|
|
<code type="php">
|
|
$user = new User();
|
|
$user->name = 'some user';
|
|
|
|
$user->Phonenumber[]->phonenumber = '123 123';
|
|
$user->Phonenumber[]->phonenumber = '456 123';
|
|
$user->Phonenumber[]->phonenumber = '123 777';
|
|
|
|
// saves the user and the associated phonenumbers
|
|
$user->save();
|
|
</code>
|
|
|
|
+++ Retrieving related records
|
|
|
|
You can retrieve related records by the very same {{Doctrine_Record}} methods you've already propably used for accessing record properties. When accessing related record you just simply use the class names.
|
|
|
|
<code type="php">
|
|
print $user->Email['address'];
|
|
|
|
print $user->Phonenumber[0]->phonenumber;
|
|
|
|
print $user->Group[0]->name;
|
|
</code>
|
|
|
|
|
|
+++ Updating related records
|
|
|
|
You can update the related records by calling save for each related object / collection individually or by calling save on the object that owns the other objects. You can also call {{Doctrine_Connection::flush}} which saves all pending objects.
|
|
|
|
<code type="php">
|
|
$user->Email['address'] = 'koskenkorva@drinkmore.info';
|
|
|
|
$user->Phonenumber[0]->phonenumber = '123123';
|
|
|
|
$user->save();
|
|
|
|
// saves the email and phonenumber
|
|
</code>
|
|
|
|
|
|
+++ Deleting related records
|
|
|
|
You can delete related records individually be calling {{delete()}} on a record or on a collection.
|
|
|
|
<code type="php">
|
|
$user->Email->delete();
|
|
|
|
$user->Phonenumber[3]->delete();
|
|
|
|
// deleting user and all related objects:
|
|
|
|
$user->delete();
|
|
</code>
|
|
|
|
Usually in a typical web application the primary keys of the related objects that are to be deleted come from a form. In this case the most efficient way of deleting the related records is using DQL DELETE statement. Lets say we have once again users and phonenumbers with their relation being one-to-many. Deleting the given phonenumbers for given user id can be achieved as follows:
|
|
|
|
<code type="php">
|
|
$deleted = Doctrine_Query::create()
|
|
->delete()
|
|
->from('Phonenumber')
|
|
->addWhere('user_id = ?', array($userId))
|
|
->whereIn('group_id', $groupIds);
|
|
->execute();
|
|
// print out the number of deleted phonenumbers
|
|
print $deleted;
|
|
</code>
|
|
|
|
|