我有三个表项目,任务和标签。 Projects.id是第一个表的主键,Tasks.id是第二个表的PK,Tags.id是第三个表的PK。
项目模型代码段
public $primaryKey = 'id';
public $hasMany = array(
'Tasks' => array('className' => 'Tasks','foreignKey' => 'project_id')
);
任务型号代码段
public $primaryKey = 'id';
public $hasMany = array(
'Tags' => array('className' => 'Tags','foreignKey' => 'task_id')
);
以下查询会返回一些意外结果。
$data = $this->Projects->find('all', array(
'recursive' => 2,
'contain' => array(
'Tags' => array(
'conditions' => array('Tags.tag_name =' => "Driver")
)
)
));
我得到的回复数据是
[Projects] => Array
(
[id] => 1
[project_id] => 1234
[project_name] => XYZ
)
[Tasks] => Array
(
[0] => Array
(
[id] => 1
[project_id] => 1
[task_id] => 12
[task_name] => task1
[Tags] => Array
(
[0] => Array
(
[id] => 1
[task_id] => 1
[tag_id] => 3444
[tag_name] => Driver
)
)
)
[1] => Array
(
[id] => 2
[project_id] => 1
[task_id] => 343242
[task_name] => task2
[Tags] => Array
(
)
)
看到我甚至没有标记作为驱动程序的任务。如何在没有标记驱动程序的情况下排除任务?
换句话说,task1确实有Tag作为驱动程序,所以应该在那里。但是task2没有任何标记,即使这样,返回数据也包含task2。如何解决?
答案 0 :(得分:0)
您不能根据子模型的条件限制主模型或父模型的结果,因为“包含”实际上会为每个包含模型创建单独的查询。
要获得正确的结果,您必须使用join。