这是一个非常奇怪的问题,我在很长一段时间内都无法弄清楚。
我有一个上传模型, UploadModel 会忽略几个 hasMany 。
例如。 上传 hasMany 面孔。
在评论表上,我有一个名为foreign_key的字段,用于托管Upload.id。 所以UploadModel中的关系如下所示:
$hasMany = ['Face' => ['foreignKey' => 'Face.upload_id']];
在上传中使用包含面+条件 [Face.celebrity_id = 4018] 执行查找时,我收到以下错误,因为查询缺少左连接到面:
$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'
如果不是在$ hasMany中,我在$ belongsTo中添加了Face关系,它会将关系添加到查询中并且它可以正常工作!
但是一个上传可以有很多Faces,Face.upload_id有foreignKey上传,所以它需要成为一个母亲!HASMANY ......哈哈
正如你所看到的,这很可怕,我已经绝望了,我在每个查询之前添加了一个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
感谢您的帮助,谢谢。
答案 0 :(得分:0)
答案 1 :(得分:0)
在test()
函数中,您在upload
表上运行查询。因此,它无法与您的查询中的Face.celebrity_id
字段匹配。你首先知道的两件事:
conditions
子句中编写的条件将应用于与您的模型匹配的表。在您的情况下,upload
是执行查询的表,而您的表中不包含字段Face.celebrity_id
。 test()
函数中所写的那样进行查询,它不会加入查询结果。 你能做的是,
$this->find('all', array(
'contain' => array(
'Face' => array('conditions' => 'Face.celebrity_id = 4018'))))
如果upload
为face
,则会返回celebrity_id
表的所有行以及4018
表的相关行,否则为null
数组。
希望这会对您有所帮助,如果您希望只返回那些与Face.celebrity_id = 4018
相关联的行,首先您需要在face
表上运行查询,然后在第一个查询结果上运行另一行。
有关第二种情况的更多详细信息,请参阅this。