CakePhp'包含'与强制加入?

时间:2017-05-09 15:54:40

标签: php mysql cakephp join

所以,我正在使用CakePHP和基于MVC的项目来连接一系列表。在我的研究中,我发现了两种主要的连接方式。

'contains' - 专注于使用MVC框架模型中的现有关联。

'强制加入' - 类似于SQL的INNER JOIN类型子句,允许在特定条件下发生多个连接。

反正。我开始使用包来聚合表,并且它工作,但我发现当我需要使一些功能更复杂,我不得不使用强制连接。

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

'包含':

$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);

“OfficialTeams”,“Tags”,“Answers”,“Users”,“Posts”都是SQL数据库中的表。此代码位于OfficialTeams控制器中,这就是为什么在发现“$ this”时首先引用官方团队。

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

在任何情况下,任何关于为什么我强行加入查询都无法正常工作的帮助将非常感谢。谢谢!

编辑:表格关系。 Table Relationships are here

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

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

1 个答案:

答案 0 :(得分:0)

我正在使用'包含'对于一个类似的老鼠窝,当我熟练地(哈哈)操纵递归参数时,我发现它是有效的。

有没有办法可以创建一个中间表来处理多对多关系?这就是我能够使用'包含',这对我来说似乎更像蛋糕。