Cakephp 2.8.4忽略hasMany

时间:2016-06-21 14:07:13

标签: php mysql cakephp models cakephp-2.8

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

我有一个上传模型, 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'

正如您所看到的那样,查询缺少左侧与Face的联接,这就是所有问题

如果不是在$ 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

感谢您的帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

好的,所以基本上,它不是忽略了hasMany,但是我不能在hasMany关系上使用条件,只有在它是hasOne时才能完成

答案 1 :(得分:0)

test()函数中,您在upload表上运行查询。因此,它无法与您的查询中的Face.celebrity_id字段匹配。你首先知道的两件事:

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

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

    如果uploadface,则会返回celebrity_id表的所有行以及4018表的相关行,否则为null数组。

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

    有关第二种情况的更多详细信息,请参阅this