1

我已经升级到 CakePHP 3.4 并且我正在检查 3.4 弃用列表,迁移指南说getMatching() 必须在 setMatching() 之后调用以保持旧行为 我很困惑并且找不到任何文档关于 setMatching() 和 getMatching() 函数的示例。我应该如何或在哪里声明 setMatching()。任何人都可以向我指出如何使用 setMatching 和 getMatching 重写以下代码:

TableRegistry::get('Students')->find()
        ->distinct([ 'Students.id'])
        ->matching('Studentclassrooms.Classrooms',
              function ($q) use ( $classid ){
                   return $q->where([ 'Classrooms.id' => $classid ]);
              });
        ->enableAutoFields(true);

当我尝试以下时,我得到了错误

未知方法“setMatching”</p>

TableRegistry::get('Students')->find()
        ->distinct([ 'Students.id'])
        ->setMatching('Studentclassrooms.Classrooms',
              function ($q) use ( $classid ){
                    return $q->where([ 'Classrooms.id' => $classid ]);
              })
        ->getMatching()
        ->enableAutoFields(true);
4

1 回答 1

0

仔细查看迁移指南(目前已关闭,似乎是主机的问题),\Cake\ORM\Query::matching()没有被弃用,\Cake\ORM\EagerLoader::matching()就是这样(它又在内部使用\Cake\ORM\Query::matching()),没有\Cake\ORM\Query::setMatching()/getMatching()方法,但是\Cake\ORM\EagerLoader::setMatching()/getMatching().

必须调用getMatching()aftersetMatching()是因为 distinct matching('Alias'),它将返回一个包含数组,setMatching('Alias')将设置匹配的东西,而是返回$this。因此,为了检索准备好的容器数组,您必须在getMatching()之后调用。

长话短说,您的示例中的任何内容都不需要重写。

于 2017-02-21T13:51:57.927 回答