Доктрина запросов и доступа с отношениями - PullRequest
1 голос
/ 23 сентября 2011

Нет проблем, просто вопрос о хорошем написании кода. Я все еще изучаю Symfony + ORM и не ориентируюсь в этих рамках.

У меня в таблице базы данных Пользователь (со столбцом входа в систему) и Учетная запись (также со столбцом входа в систему, который отличается от имени входа в Пользователе).

Один пользователь (идентифицируется по идентификатору для базы данных и по логину для входа в систему) имеет много учетных записей (идентифицируется также по идентификатору и имени для входа в систему, которые действуют как имя учетной записи). Итак, отношение в schema.yml:

Account:
(...)
relations:
  idUser:
    class: User
    local: id_user
    foreign: id_user
    foreignAlias: Accounts

Теперь я пытаюсь получить доступ ко всем логинам Аккаунта, связанным с логином одного Пользователя, следующим образом (скажем, пока я только отображаю список логинов Аккаунта текущего пользователя):

        /* $u = login-name of the current user */
        $q = Doctrine::getTable('User')->
                createQuery('u')->innerjoin('u.Accounts a WITH u.login=?', $u)->execute();
        foreach($q[0]->Accounts as $v) {
            echo $v->login . "<br />";
        }

Этот код работает очень хорошо. Однако, что мне сейчас интересно, так это разве это не уродливо или не самый лучший способ добиться этого? Как я уже сказал, у меня нет особой ориентации в Symfony, и я не знаю, какие методы программирования рекомендуются, а какие нет.

1 Ответ

0 голосов
/ 24 сентября 2011

Это не выглядит так плохо для меня, но я бы написал это так:

/* $login = login-name of the current user */
/* Always use ModelTable::getInstance() instead of Doctrine::getTable : 
   your IDE will give you better auto-completion if the doc block of the
   getInstance has a correct @return annotation.
   You will have all the methods of ModelTable in your auto-completion */
$users = UserTable::getInstance() 
  ->createQuery('u')
    ->innerjoin('u.Accounts a WITH u.login = ?', $login) 
      ->execute(); //Try to align opening parenthesis when writing DQL, it is easier to read

foreach ($users[0]->Accounts as $v) // egyptian brackets are for java(script) programmers
{
  echo $v->login . "<br />";
}
...