【发布时间】:2017-10-08 01:02:37
【问题描述】:
所以,我正在使用 CakePHP 和基于 MVC 的项目来连接一系列表格。在我的研究中,我发现了两种主要的连接方式。
'contain' - 侧重于使用 MVC 框架的 Model 中的现有关联。
'forced join' - 类似于 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);
“OfficialTeams”、“Tags”、“Answers”、“Users”、“Posts”都是 SQL 数据库中的表。此代码位于 OfficialTeams 控制器中,这就是为什么在执行时发现“$this”首先指的是 OfficialTeams。
我也知道为什么对于更复杂的连接“包含”不起作用,这是因为“包含”使用表中的现有关系,但它不能利用“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应该是一个数组。该当前数据的值是空的。
另一个奇怪的行为。当我通过“抛出”调用打印出查询时(强制它失败,以便我可以打印出查询)。 “包含”代码块和“强制连接”代码块的查询是完全相同的查询。
【问题讨论】:
-
把你的表关系放在这里。
-
嗨@RayannNayran,我在表关系中添加了。
-
请具体一点,“不起作用”不是正确的问题描述。究竟会发生什么,以及您期望会发生什么?生成的查询是什么样的?另外,请务必提及您的 确切 CakePHP 版本(
vendor/cakephp/cakephp/VERSION.txt或lib/Cake/VERSION.txt中的最后一行) - 谢谢! ps,->是无效的 PHP。 -
嘿@ndm。我将您问题的答案放在“再次编辑”部分。基本上,我的 Cake 版本是 3.3.10,“包含”和“强制连接”的查询是完全相同的查询。
-
对于初学者来说,您正在查看错误的文档,您链接的是 CakePHP 2.x,CakePHP 3.x 中没有
joins选项,它要么是 @987654331 @,或者您使用查询生成器提供的连接方法之一:book.cakephp.org/3.0/en/orm/query-builder.html#adding-joins | book.cakephp.org/3.0/en/orm/…。每当收到错误时,请始终发布 complete 错误,即包括 full 堆栈跟踪(最好从日志中以正确可读的方式复制)。