在Doctrine中寻找相关行 - “最干净”的设计?

时间:2011-02-16 07:59:23

标签: doctrine

我是Doctrine的新手,我正试图同时了解Doctrine和Symfony,所以请耐心等待。

我有一个“句子”对象。用户可以对句子进行“评分”(得分为五分)。我用相当明显的设计对其进行建模,其中我有一个Sentence表,一个User表和一个Rating表。评级表中的每一行代表一个用户对一个句子的评分。

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的新查询,或者甚至使用其中一个“魔术”查找程序。但这似乎有点笨拙而且不是很OO,当我已经在内存中有一个Sentence对象时,我为Doctrine生成了一个getRatings()方法,这个方法必须已经在其“所有这个句子的评级”的集合中得到了我想要的评级。

是否有一种简单有效的方式,我缺少像$sentence->getRatings()->findByUserId($user->getId())这样的东西?

或者仅仅忽略这样一个事实,即我已经在内存中收集了“这句话的评级”这一事实,然后再回到数据库中,完全忽略它们?

1 个答案:

答案 0 :(得分:0)

在集合中没有一个像我那样知道的发现者(与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;
}