【问题标题】:CakePhp 'contains' versus a forced joining?CakePhp“包含”与强制加入?
【发布时间】: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.txtlib/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 堆栈跟踪(最好从日志中以正确可读的方式复制)。

标签: php mysql cakephp join


【解决方案1】:

我将“包含”用于类似的老鼠窝,当我熟练地(哈哈)操纵递归参数时,我发现它很有效。

有什么方法可以创建一个中间表来处理多对多关系?这就是我为能够使用“包含”所做的事情,这对我来说似乎更本地化..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2019-01-04
    相关资源
    最近更新 更多