Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Doctrine 在条令中查找相关行--”;“最干净的”;设计?_Doctrine - Fatal编程技术网

Doctrine 在条令中查找相关行--”;“最干净的”;设计?

Doctrine 在条令中查找相关行--”;“最干净的”;设计?,doctrine,Doctrine,我不熟悉条令,我正试图同时了解条令和Symfony,所以请容忍我 我有一个“句子”宾语。用户可以对句子进行“评分”(五分制)。我用非常明显的设计对此进行建模,其中我有一个句子表、一个用户表和一个评分表。评级表中的每一行代表一个用户对一句话的评级 Rating: ... columns: rating: { type: integer } # This is my score out of five sentence_id: { type: integer } us

我不熟悉条令,我正试图同时了解条令和Symfony,所以请容忍我

我有一个“句子”宾语。用户可以对句子进行“评分”(五分制)。我用非常明显的设计对此进行建模,其中我有一个句子表、一个用户表和一个评分表。评级表中的每一行代表一个用户对一句话的评级

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编写一个新的查询,甚至使用一个“神奇的”查找器。但这似乎有点笨拙,也不是很面向对象,因为我的内存中已经有了一个句子对象,其中包含了一个由Doctrine为我生成的getRatings()方法,该方法在其“此句子的所有评级”集合中必须已经有了我想要的评级

有没有一种简单、有效的方法,我在做类似于
$句子->getRatings()->findByUserId($user->getId())
的事情时没有找到


或者,忽略我已经在内存中收集了一组“这句话的评级”,然后跳回数据库,完全忽略它们,这是明智的做法吗?

在我所知道的集合中,没有一个查找器(与Prope不同)。。。如果有,并且我在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;
}

这很有趣,但它看起来几乎与我现有的getUserRating函数完全相同:)它在编写它时,一直在想“我正在手工编写我自己的foreach()循环,以找到一个数据库对象,该对象在我要找的东西上有一个索引?我做错了什么”,这促使我提出这个问题!很高兴看到有人证实我可能没有那么疯狂。不过,我将把这个问题留一段时间,看看是否有人提出了让我们惊讶的东西……好吧,我想这就是我的答案!我们谁也不会得到太多的幸福:)在这种情况下,我可能会做的是完全忽略句子上的评级集合,这有点像转移视线,而只是简单地使用RatingTable上生成的神奇方法,例如FindOneBysentenceandUserId。这将代码最小化,使用DB及其索引查找评级,并应安全地与句子的评级集合交互,因为原则应仅适用于任何给定评级的一个实例。。。再次感谢你的第二双眼睛!