Поиск связанных строк в доктрине - «самый чистый» дизайн? - PullRequest
0 голосов
/ 16 февраля 2011

Я новичок в Доктрине, и я пытаюсь свести воедино и Доктрину, и Симфонию одновременно, поэтому, пожалуйста, потерпите меня.

У меня есть объект "Предложение". Пользователи могут «оценивать» (оценивать из пяти) предложения. Я моделирую это с довольно очевидным дизайном, где у меня есть таблица предложений, таблица пользователей и таблица рейтинга. Каждая строка в таблице рейтинга представляет рейтинг одного пользователя в одном предложении.

Rating:
  ...
  columns:
    rating: { type: integer } # This is my score out of five
    sentence_id: { type: integer }
    user_id: { type: integer }
  relations:
    sfGuardUser: { local: user_id }
    Sentence: { local: sentence_id, onDelete: CASCADE, foreignAlias: Ratings }

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

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

В сыром SQL я хочу сделать следующее:

SELECT 
    rating 
FROM
    rating_table 
WHERE 
    sentence_id = {$sentence->id} AND user_id = {$user->id}

Теперь я знаю, что мог бы просто сделать это с помощью RatingTable, просто написав новый запрос с небольшим количеством DQL или даже используя один из «волшебных» искателей. Но это кажется немного неуклюжим и не очень оригинальным, когда у меня уже есть объект Sentence в памяти с методом getRatings (), сгенерированным для меня Doctrine, который уже должен иметь оценку, которую я хочу в своей коллекции «всех оценок для этого предложения» .

Есть ли простой, эффективный способ, которым я упускаю что-то вроде $sentence->getRatings()->findByUserId($user->getId())?

Или действительно разумно просто игнорировать тот факт, что у меня уже есть коллекция "оценок для этого предложения" в памяти, и вернуться к базе данных, полностью игнорируя их?

1 Ответ

0 голосов
/ 16 февраля 2011

В коллекции нет такого искателя, о котором я знаю (в отличие от Propel) ... если есть и я пропустил его в Doctrine API, то я собираюсь использовать блаженный кусок кода, когда кто-то публикует его: -)

Сказав это, если у вас уже есть загруженная коллекция, я бы просто добавил собственный метод для модели .. например:

public function getUserRating($user){
  if($user instanceof Doctrine_Record){ // or sfGuardUser depending on how tightly you want to couple
     $user = $user->getId();
  }

  foreach($this->getRatings() as $rating){
     if($user == $rating->getUserId()){
        return $rating;
     }
  }

  return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...