0

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

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

例如。上传hasMany Face

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

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

当在 Upload 中执行包含 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 应该可以工作!!!!F****!!!!!

我希望 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

我感谢任何帮助,谢谢。

4

2 回答 2

0

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

于 2016-06-21T15:31:53.237 回答
0

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

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

你能做的是,

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

如果是,这将返回所有表格行upload以及相关联的表格行,否则返回数组。facecelebrity_id4018null

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

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

于 2016-06-21T15:52:42.830 回答