我有三个表项目,任务和标签。 Projects.id 是第一个表的主键,Tasks.id 是第二个表的主键,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 确实有标签作为驱动程序,所以应该在那里。但是 task2 没有任何标记,即使这样,返回数据也包含 task2。如何解决?
不能根据子模型上的条件限制主模型或父模型的结果,因为"contain"实际上为每个包含模型创建单独的查询。
要获得正确的结果,您必须使用 join。