关于加入Cakephp,我有几个问题

关于加入Cakephp,我有几个问题,cakephp,cakephp-3.0,Cakephp,Cakephp 3.0,谢谢你的阅读。 我正在学习cakephp,对加入cakephp有一些问题。 我在网上找不到合适的答案 1、innerjoin和innerjoinwith(如leftjoin和leftjoinwith)的区别是什么?我认为这与性能问题有关,但找不到任何线索 2.我无法准确区分“匹配”和“包含” 我知道他们检索数据的方式不同,但我认为结果看起来与匹配的结果相同,匹配使用的是innerjoin,而contain使用的是leftjoin 但是我找不到下面的代码(使用contain)和匹配之间的区别 $q

谢谢你的阅读。 我正在学习cakephp,对加入cakephp有一些问题。 我在网上找不到合适的答案


1、innerjoin和innerjoinwith(如leftjoin和leftjoinwith)的区别是什么?我认为这与性能问题有关,但找不到任何线索

2.我无法准确区分“匹配”和“包含” 我知道他们检索数据的方式不同,但我认为结果看起来与匹配的结果相同,匹配使用的是innerjoin,而contain使用的是leftjoin

但是我找不到下面的代码(使用contain)和匹配之间的区别

$query = $articles->find()->contain([
'Comments' => function ($q) {
return $q
->select(['body', 'author_id'])
->where(['Comments.approved' => true]);
}
]);
$query = $articles->find()->contain([
'Comments' => function ($q) {
return $q
->select(['body', 'author_id'])
->where(['Comments.approved' => true]);
}
]);
3、匹配中的“匹配数据”是什么? 我看了这个描述,就是 innerJoinWith()方法的工作原理与matching()相同,这意味着您可以使用点表示法来连接深度嵌套的关联:同样,唯一的区别是不会向结果集中添加其他列,也不会设置_matchingData属性

但是我找不到关于匹配数据的任何描述。即使在API中。。。是什么


你可以回应其中一个,没关系。请帮我解答一下

1,innerjoin和innerjoinwith(如leftjoin和leftjoinwith)的区别是什么?我以为这与性能问题有关,但找不到任何线索

=> (1) 这里的'innerJoinWith'是一个可调用函数,它将应用右/内连接 (2) 对于左连接,“leftJoinWith”是可调用的

https://book.cakephp.org/3.0/en/orm/query-builder.html#using-innerjoinwith

https://book.cakephp.org/3.0/en/orm/query-builder.html#using-leftjoinwith
2.我无法准确区分“匹配”和“包含” 我知道他们检索数据的方式不同,但我认为结果与此处输入代码的结果相同,匹配使用innerjoin,而包含使用leftjoin

但是我找不到下面的代码(使用contain)和匹配之间的区别

$query = $articles->find()->contain([
'Comments' => function ($q) {
return $q
->select(['body', 'author_id'])
->where(['Comments.approved' => true]);
}
]);
$query = $articles->find()->contain([
'Comments' => function ($q) {
return $q
->select(['body', 'author_id'])
->where(['Comments.approved' => true]);
}
]);
=>简言之,contain将leftJoin和匹配的apply right/internal连接应用于查询。 请阅读此链接的第一行

3、匹配中的“匹配数据”是什么? 我看了这个描述,就是
innerJoinWith()
方法的工作原理与matching()相同,这意味着您可以使用点表示法连接深度嵌套的关联:同样,唯一的区别是不会向结果集中添加额外的列,也不会设置
\u matchingData
属性

但是我找不到关于匹配数据的任何描述。即使在API中。。。是什么

=>
\u matchingData()
是使用matching()时创建的实体属性。它包含选定的匹配数据

$query = $articles->find(); 
$query = $query->matching('Comments', function($q){
            $q->select(['Comments.body', 'Comments.author_id']);
            $q->where(['Comments.is_approved' => 1]);
        return $q;
});

上面的查询将具有包含Comments.body、Comments.author\u id的_matchingData属性

如果启用,您可以尝试不同的查询组合并检查它们生成的SQL,这可能会让您更好地了解1和2。查看从
匹配
查询返回的数据应该可以让您清楚地了解
\u matchingData
中的内容。一个非常简短的答案是,如果您包含一个
hasMany
关系,则记录将通过单独的查询加载,而
匹配
将通过连接加载。Greg Schmidt//谢谢!这很有帮助!谢谢你回答我的问题。你救了我!我只想检查一下你在问题1中评论的“callable”是否与下面的链接相同。再次感谢您的回答!是可调用/回调您可以将函数作为参数传递