Обычно я бы делал что-то вроде этого:
$location = new Location();
$location->name = 'yyy';
$location->save(); // this will assign location id using autoincrement
// or alternatively if you have generated table classes
// $location = LocationTable::getInstance()->create(array('name' => 'yyy');
// or if you have an already existing location
// $location = LocationTable::getInstance()->find($location_id);
// keep in mind that if you haven't generated any table class you should replace
// LocationTable::getInstance() with Doctrine_Core::getTable('Location');
$user = new User();
$user->name = 'xxx';
$user->location = $location;
// or $user->Location = $location; // the case of the l depends on how you have declared the model relationships
$user->save;
$user2 = new User();
$user2->name = 'zzz';
$user2->location = $location;
$user2->save;
Вообще говоря, в Doctrine есть много удобных методов для работы с отношениями, правильный выбор зависит от ваших конкретных потребностей.Например, вы должны указать, как строится ваш объект местоположения, сколько пользовательских экземпляров у вас в одном и том же коде, если у вас есть идентификатор местоположения или данные местоположения и т. Д.
Для пунктов 1,2 и 3в rails я бы использовал метод find_or_create_by, который недоступен в Doctrine, но вы всегда можете написать его самостоятельно.Поэтому, если у вас есть класс LocationTable
, вы можете сделать это:
// in LocationTable class
public function findOrCreateBy($fieldName, $value, array $data = array())
{
if (!$record = $this->findBy($fieldName, $value)) {
// record doesn't exist, create it with provided data
$record = $this->create(array($fieldName => $value));
}
// update record data
$record->fromArray($data);
// optionally save the record, depend on your needs
$record->save(); // it won't trigger actual save if record fields aren't updated
return $record;
}
// then in your example code you could fetch the location code with
$location = LocationTable::getInstance()
->findOrCreateBy('name', 'yyyy', array('field_to_update' => 'new value'));
Не используйте preSave-хуки для такого рода вещей, я думаю, что их следует использовать для других случаев использования.