CakePhp"包含"还是强制加入?



所以,我正在使用CakePHP和基于MVC的项目将一系列表连接在一起。在我的研究中,我发现了进行这些连接的两种主要方法。

"包含" - 侧重于使用 MVC 框架模型中的现有关联。

"强制连接" - 类似于 SQL 的 INNER JOIN 类型子句,允许在特定条件下进行多次连接。

无论如何。我开始使用 contains 将表聚合在一起,它奏效了,但我发现当我需要使该功能更加复杂时,我必须使用强制联接。

所以下面是我聚合表的"包含"方式,它有效,我有一个类似的结构化代码块用于强制连接,我想知道为什么我的强制连接不起作用?我在文档中做了一些研究,一切似乎都是正确的。我错过了什么?

"包含":

$tags = $this->OfficialTeams->Tags->find('all', ['conditions' => ['official' => true], 
'contain' => ["Questions.Answers.Posts"] ]);

"强制加入">

$options['joins'] = array(
array(
'table' -> 'Users',
'alias' -> 'Users',
'type' -> 'INNER',
'conditions' -> array('Users.id = Tag.user_id')
),
array(
'table' -> 'Posts',
'alias' -> 'Post',
'type' -> 'INNER',
'conditions' -> array('Users.id = Posts.user_id')
),
array(
'table' -> 'Questions',
'alias' -> 'Question',
'type' -> 'INNER',
'conditions' -> array('Questions.post_id = Posts.id')
),
array(
'table' -> 'Answers',
'alias' -> 'Answer',
'type' -> 'INNER',
'conditions' -> array('Answers.post_id = Posts.id')
)
);
$options['conditions'] = array(['official' => true]);
$tags = $this->OfficialTeams->Tags->find('all', $options);

"官方团队"、"标签"、"答案"、"用户"、"帖子"都是SQL数据库中的表。此代码位于官方团队控制器中,这就是为什么在查找时"$this"首先指的是官方团队。

我也知道为什么对于更复杂的连接,"包含"不起作用,这是因为"包含"使用表中的现有关系,但它不能使用"hasAndBelongsToMany"关联。我在CakePHP文档中发现了这一点。 https://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#joining-tables

无论如何,任何关于为什么我的强制联接查询不起作用的帮助将不胜感激。谢谢!

编辑:表关系。 表关系在这里

再次编辑:我的版本是Cake 3.3.10,至于预期行为与当前行为。我有一个表单上的数据,一旦聚合并从各种表的数据库中提取,就会呈现和计算该表单。预期的行为只是出现两个数字(具体来说,这些数字表示官方团队针对特定用户的问题/帖子/答案的数量)。至于当前的行为,问题/帖子/答案的数量是一个警告:array_map,参数 2 应该是一个数组。当前数据段的值为 null。

另一个奇怪的行为。当我通过"抛出"调用打印出查询时(强制它失败,以便我可以打印出查询)。对"包含"代码块和"强制联接"代码块的查询是完全相同的查询。

我使用"包含"来表示类似的老鼠巢,当我熟练地(哈哈)操作递归参数时,我发现它有效。

有什么方法可以创建一个中间表来处理多对多关系? 这就是我为了能够使用"包含"所做的,这对我来说似乎更像蛋糕原生。

最新更新