Cakephp 2.8.4 忽略 hasMany

Posted

技术标签:

【中文标题】Cakephp 2.8.4 忽略 hasMany【英文标题】:Cakephp 2.8.4 ignoring hasMany 【发布时间】:2016-06-21 14:07:12 【问题描述】:

这是一个很奇怪的问题,我很长时间都无法弄清楚。

我有一个模型 Upload,其中几个 hasMany 都被 UploadModel 忽略了。

例如。 上传有很多面孔

在 cmets 表上,我有一个名为 foreign_key 的字段,它承载 Upload.id。 所以 UploadModel 中的关系是这样的:

$hasMany = ['Face' => ['foreignKey' => 'Face.upload_id']];

在上传中执行包含 Face + 条件的查找时 [Face.celebrity_id = 4018] 我收到以下错误,因为查询缺少 Left Join to Face:

$media = $this->Upload->find('all',array(
        'conditions' => array(
            'Face.celebrity_id' => 4018
        ),
        'contain' => array(
            'Face'
        )
    ));

SQL Query: 
SELECT `Upload`.`id`, `Upload`.`user_id`, `Upload`.`filename`, `Upload`.`created` 
FROM `uploads` AS `Upload` 
WHERE `Face`.`celebrity_id` = 4018;

SQL Error:
Unknown column 'Face.celebrity_id' in 'where clause'

如您所见,查询缺少与 Face 的左连接,这就是问题所在

如果我不是在 $hasMany 中,而是在 $belongsTo 中添加 Face 关系,它会将关系添加到查询中并且可以正常工作!

但是一个 Upload 可以有很多 Faces,并且 Face.upload_id 有要上传的 foreignKey,所以它需要是一个母亲 ***** HASMANY...lol


如你所见,这太可怕了,我已经绝望了,我已经通过在每个查询之前添加一个 bindModel() 来绕过这个问题,但这完全没有必要,hasMany 应该可以工作!!!!他妈的!!!!!!

我希望 Cake 为我执行的查询是这样的:

SELECT `Upload`.`id`, `Upload`.`filename` FROM `uploads` AS `Upload` 
LEFT JOIN `upload_faces` AS `Face` ON (`Upload`.id = `Face`.`upload_id`)
WHERE `Face`.`celebrity_id` = 4018

感谢您的帮助,谢谢。

【问题讨论】:

这里同样的问题:***.com/questions/12114532/… 【参考方案1】:

好的,所以基本上,它并没有忽略hasMany,但是我不能在hasMany关系上使用条件,只有当它是hasOne时才能这样做

【讨论】:

【参考方案2】:

在您的test() 函数中,您对upload 表运行查询。所以它不能匹配您查询中的Face.celebrity_id 字段。你首先要知道两件事:

    您在conditions 子句中编写的条件应用于与您的模型匹配的表。在您的情况下,upload 是执行查询的表,并且您的表不包含字段 Face.celebrity_id。 $hasMany 创建应用程序级关系(关联)。因此,通过像您在test() 函数中编写的那样进行查询,它不会加入查询结果。

你能做的是,

$this->find('all', array(  
    'contain' => array(
    'Face' => array('conditions' => 'Face.celebrity_id = 4018'))))  

如果celebrity_id4018,这将返回upload 表的所有行以及face 表的关联行,否则null 数组。

希望这会对您有所帮助,如果您希望只返回与Face.celebrity_id = 4018 关联的那些行,首先您必须在face 表上运行查询,然后在第一个查询结果上运行另一个。

有关第二种情况的更多详细信息,您可以参考this。

【讨论】:

我认为我没有正确解释自己。但我认为这是一个 Cakephp 问题,或者我的模型中的一个问题,因为您可以在 JOINED 模型上使用条件,我以前做过,SQL 示例:SELECT Upload.id, Upload.@987654341 @ FROM uploads AS Upload LEFT JOIN upload_faces AS Face ON (Upload.id = Face.upload_id) WHERE Face.celebrity_id = 4018 可能应该试试这个:[link] (***.com/a/18116633/5260631) 如果您首先不清楚您的问题,那么您应该询问完全需要的解决方案。当您的问题模棱两可时,否决投票的答案不是您应该做的事情。 很抱歉,问题已被缩短,只是为了尝试获得更多答案。这并不意味着之前不清楚,我只是为了礼貌。实际上,我相信你记得一开始就有更多的信息。反对票可能太多了。

以上是关于Cakephp 2.8.4 忽略 hasMany的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP SVN忽略

脚手架忽略 CakePHP 中的类文件

PatchEntity 在 Cakephp 3.0 中忽略来自 ajax 请求的数据

CakePHP 3.5 400 错误请求

CakePHP:随机查询一个结果,排除两个值

如何在 CakePHP 中嵌入 swf 文件