Zend Framework + Doctrine 2: Как мне сопоставить существующую запись (язык) с новой записью (пользователь)? - PullRequest
1 голос
/ 12 января 2012

Я использую Zend Framework в сочетании с Doctrine 2. В настоящее время я пытаюсь сделать следующее:

Сохранение пользователя с соответствующим языком по умолчанию, который уже существует в базе данных.

Итак, у меня есть две модели: пользовательская и языковая.

Атрибут языка пользовательской модели указывает на идентификатор языковой модели через опцию ManyToOne в доктрине.

Поэтому я использую следующий код в пользовательской модели для сопоставления двух моделей:

/**
 * @var integer $language
 * @ManyToOne(targetEntity="Application_Model_Language", inversedBy="id", cascade={"persist"})
 */
 private $language;

Внешний ключ обновляется прямо в базе данных mysql.Так что пока все в порядке.

Код следующий:

$defaultLanguage = $this->getUserLanguage('en');
$language = new Application_Model_Language();
$language->__set('id', $defaultLanguage);
$language->__set('name', $defaultLanguage);
$user = new Application_Model_User($username, $email, $array['password'], $array['salt']);
$user->__set('language', $language);
$user->save($user);

private function getUserLanguage($defaultLanguage){
    $registry = Zend_Registry::getInstance();
    $this->_em = $registry->entitymanager;
    $queryBuilder = $this->_em->createQueryBuilder();
    $query = $queryBuilder->add('select', 'l.id')
    ->add('from', 'Application_Model_Language l')
    ->add('where', 'l.name = ?1')
    ->setParameter(1, $defaultLanguage)
    ->getQuery();
    $result = $query->execute();  
    return $result[0]['id'];
}

Итак, с помощью приведенного выше кода я сначала получаю идентификатор языка с именем 'en' ипотом я пытаюсь сопоставить его с пользователем, но на самом деле не знаю, как именно.

Это не сработает.Я получаю сообщение об ошибке.

Так как я могу относиться к языку, даже если он уже есть в базе данных (список всех поддерживаемых языков)?

Заранее спасибо!

1 Ответ

0 голосов
/ 09 февраля 2012

Я думаю, что ваша аннотация немного запутана.С вашей аннотацией ManyToOne вам не нужно использовать inversedBy, если вы не хотите двунаправленных отношений между двумя объектами.И если вы хотите, чтобы вы не использовали inversedBy = "id", потому что поле id языкового объекта - это его первичный ключ, а не ссылка на пользователя.Взгляните на документацию для сопоставления ассоциации ManyToOne .

...