2016-02-28 80 views
2

我需要找到具有相同作者的文章如何使用CakePHP中的匹配()找到具有共同父项的实体?

这里给定列表中的所有的文章是我的自定义finder方法:

public function findSimilar(Query $query, array $options) 
    { 
     if (empty($options['idList'])) { 
      throw new Exception('idList is not populated'); 
     } 
     // We are given a list of article IDs 
     $idList = $options['idList']; 

     return $query->matching('Authors', function ($q) use ($idList) { 
      return $q->matching('Articles', function ($q2) use ($idList) { 
       return $q2->where(['Articles.id IN' => $idList]); 
      }); 
     }); 
    } 

不幸的是我收到以下错误消息: PDOException:SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'Articles' 我究竟做错了什么?

回答

5

有相当嵌套匹配有一些限制,这可能是其中之一。我无法分辨这是否是一个错误,因此您可能需要检查issues on GitHub并最终提交一份新文件以供澄清。从文档

引用:

[...]虚线相符路径应当超过嵌套匹配(使用)调用[...]

Cookbook > Database Access & ORM > Retrieving Data & Results Sets > Filtering by Associated Data

在任何一种情况下,使用点符号代替嵌套应该解决问题,即

return $query->matching('Authors.Articles', function ($q) use ($idList) { 
    return $q->where(['Articles.id IN' => $idList]); 
}); 

如果你想也匹配Authors,你可以堆叠的匹配,就像

return $query 
    ->matching('Authors', function ($q) { 
     return $q->where(['Authors.foo' => 'bar']); 
    }) 
    ->matching('Authors.Articles', function ($q) use ($idList) { 
     return $q->where(['Articles.id IN' => $idList]); 
    }); 
2

如果是的hasMany关系,我们可以做到这一点很容易地:

return $query->where([ 
    'Articles.author_id IN' => $this->find() 
     ->select(['Articles.author_id']) 
     ->where(['Articles.id IN' => $idList]) 
]); 

//由于jose_zap在CakePHP的IRC通道

相关问题