Php 条令:复杂连接问题

Php 条令:复杂连接问题,php,join,doctrine,Php,Join,Doctrine,我在属性和特征之间有很多关系。我必须从属性表中提取结果,但前提是两个或多个特征都相关 即,物业1与“游泳池”和“花园”相关。物业2仅与“游泳池”相关。因此,当我要求提供既有“游泳池”又有“花园”的房产时,它应该只返回房产1 我尝试了各种可能的组合,比如复杂的“where”,“where”,“join…”。。。使用“,”exists“等,但无法解决它。它要么返回所有属性,要么不返回任何属性,我真的记不起我尝试过的所有东西。请帮帮我,我已经浪费了8个小时,这简直要了我的命所以,换句话说,你要选择与多

我在属性和特征之间有很多关系。我必须从属性表中提取结果,但前提是两个或多个特征都相关

即,物业1与“游泳池”和“花园”相关。物业2仅与“游泳池”相关。因此,当我要求提供既有“游泳池”又有“花园”的房产时,它应该只返回房产1


我尝试了各种可能的组合,比如复杂的“where”,“where”,“join…”。。。使用“,”exists“等,但无法解决它。它要么返回所有属性,要么不返回任何属性,我真的记不起我尝试过的所有东西。请帮帮我,我已经浪费了8个小时,这简直要了我的命

所以,换句话说,你要选择与多个特定功能相关的所有属性

尝试:


功能应该是包含您希望加入的功能的Doctrine_集合。将$f->id替换为$f['id']以支持条令数组,或者如果您想提供一个简单的填充了功能id的数组,则替换为$f。

谢谢,我试过了,但这让我有点担心;生成的SQL非常密集:从属性p内部连接属性\功能p2(在p.id=p2.property\u id内部连接功能\吸引\实体f(在f.id=p2.feature\u id和f.name=?)?并且f.type=1选择。。。缩短。。。。p.id上的内部连接特性\特征p3=p3.id上的内部连接特性\吸引\实体f2.id=p3.feature\ id和f2.name=?f2.type=1如您所见,当我尝试搜索2个特征时,属性特征与“特征吸引实体”连接了2次。它能以某种方式被清除吗?我和Doctrine一起工作了将近一年,但是leftjoin和innerjoin之间的区别让我困惑。嗯,您可能可以执行子查询。请注意,这个“问题”不是一个条令问题,在SQL中,如果不加入同一个表两次,就没有更简单的方法可以做到这一点。也就是说,如果您确保在外键上有索引,并且在数据库中有必要的FK约束,那么这确实不是一个密集型查询。不要让连接的数量欺骗您,使您认为这是一个密集型查询。特别是,要注意WITH和WHERE之间的区别,WHERE是在连接完成后应用的,并且由于它应用于更多的记录,所以它的强度要大得多。在进行联接之前,将应用实际启用的,因此联接后保留的行将更少,这对于此联接之后的每个操作来说都是一个潜在的巨大性能改进至于LeftJoin和InnerJoin之间的区别:左连接b会在结果集中留下所有a元素,而这些元素没有对应的b。内部联接b仅返回来自具有匹配b的a的结果。属性左连接特征将返回所有属性及其特征(如果存在)。属性内部连接要素仅返回包含要素的属性。由于您不希望选择没有任何特征的属性,因此最好尽快将其过滤掉。因此,这是一个经典案例,其中内部连接是正确的方法。
function findPropertyForFeatures($features)
{
  $q = Doctrine_Query::create()->from('Property p');
  $i = 0;
    foreach ($features as $f) 
    {
      $i++;
      $q->innerJoin("p.Feature f$i WITH f$i.id = {$f->id}");
    }
  return $q->execute();
}