我是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())
这样的东西?
或者仅仅忽略这样一个事实,即我已经在内存中收集了“这句话的评级”这一事实,然后再回到数据库中,完全忽略它们?
答案 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;
}