蛋糕 PHP 查找所有与连接返回甚至不匹配的数据.如何解决它


cake php find all with join returns even non matching data. How to fix it?

我有三个表项目,任务和标签。 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')
);

下面的查询返回一些意外的结果。

    $joins = array(
        array('table' => 'project_tasks',
            'alias' => 'Tasks',
            'type' => 'inner',
            'conditions' => array(
                'Projects.id = Tasks.project_id'
            )
        ),
        array('table' => 'task_tags',
            'alias' => 'Tags',
            'type' => 'inner',
            'conditions' => array(
                'Tasks.id = Tags.task_id',
                "Tags.tag_name = 'Driver'"
            )
        )
    );
    $data = $this->Projects->find('all', array(
        'recursive' => 2,
         'joins' => $joins
    ));

我得到的响应数据是

 [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
                                (
                                  [0] => Array
                                        (
                                            [id] => 2
                                            [task_id] => 2
                                            [tag_id] => 4444
                                            [tag_name] => Doctor
                                        )
                                )
                        )

看到我什至在没有标记为驱动程序的情况下获得任务。 如何排除没有标记驱动程序的任务?

我能够通过指定要选择的"字段"并设置"递归"=> -1 来修复它,如下所示。

     $data = $this->Projects
                    ->find('all', array(
                          'recursive' => -1,
                          'joins' => $joins,
                         'fields' => array(
                             'Projects.*',
                             'Tasks.*',
                             'Tags.*'  
                          )
));