所以,我正在使用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'调用打印出查询时(强制它失败,所以我可以打印出查询)。对“包含”代码块和“强制连接”代码块的查询是完全相同的查询。
答案 0 :(得分:0)
我正在使用'包含'对于一个类似的老鼠窝,当我熟练地(哈哈)操纵递归参数时,我发现它是有效的。
有没有办法可以创建一个中间表来处理多对多关系?这就是我能够使用'包含',这对我来说似乎更像蛋糕。