Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Cakephp模型自连接和如何检索正确的数组_Arrays_Cakephp_Hash_Model_Self Join - Fatal编程技术网

Arrays Cakephp模型自连接和如何检索正确的数组

Arrays Cakephp模型自连接和如何检索正确的数组,arrays,cakephp,hash,model,self-join,Arrays,Cakephp,Hash,Model,Self Join,我有以下型号: App::uses('AppModel', 'Model'); class Sync extends AppModel { public $belongsTo = array( 'Unit' => array( 'className' => 'Sync', 'foreignKey' => 'parent_id' ) ); public $hasMany =

我有以下型号:

App::uses('AppModel', 'Model');
class Sync extends AppModel {
    public $belongsTo = array(
        'Unit' => array(
            'className' => 'Sync',
            'foreignKey' => 'parent_id'
        )
    );

    public $hasMany = array(
        'Consultant' => array(
            'className' => 'Sync',
            'foreignKey' => 'parent_id'
        )
    );
}
如果我执行一个
$this->Sync->find('all')
我会得到一个数组,几乎是我想要的方式:

Array
(
    [0] => Array
        (
            [Sync] => Array
                (
                    [id] => 22222
                    [parent_id] => 22222
                    [statistic_date] => 2012-11-14 00:00:00
                )

            [Unit] => Array
                (
                    [id] => 22222
                    [parent_id] => 22222
                    [statistic_date] => 2012-11-14 00:00:00
                )

            [Consultant] => Array
                (
                    [0] => Array
                        (
                            [id] => 11111
                            [parent_id] => 22222
                            [statistic_date] => 2011-12-15 00:00:00
                        )

                    [1] => Array
                        (
                            [id] => 33333
                            [parent_id] => 22222
                            [statistic_date] => 2011-12-14 00:00:00
                        )
                )
      )
)
问题是我想对顾问做一个条件。像这样:

$this->Sync->Consultant->find('all', array(
    'conditions' => array(
        'Consultant.statistic_date BETWEEN ? AND ?' => 'array(
            '2011-12-01 00:00:00', '2011-12-31 00:00:00'
         )'
    )
))
但是,它没有返回所需的阵列:

Array
(
    [0] => Array
        (

            [Unit] => Array
                (
                    [id] => 22222
                    [parent_id] => 22222
                    [statistic_date] => 2012-11-14 00:00:00
                )

            [Consultant] => Array
                (
                        [id] => 11111
                        [parent_id] => 22222
                        [statistic_date] => 2011-11-15 00:00:00
                )
      )

    [1] => Array
        (

            [Unit] => Array
                (
                    [id] => 22222
                    [parent_id] => 22222
                    [statistic_date] => 2012-12-14 00:00:00
                )

            [Consultant] => Array
                (
                        [id] => 33333
                        [parent_id] => 22222
                        [statistic_date] => 2011-12-14 00:00:00
                )
      )
)
我想把它写在这张表格上:

Array
(
    [0] => Array
        (

            [Unit] => Array
                (
                    [id] => 22222
                    [parent_id] => 22222
                    [statistic_date] => 2012-11-14 00:00:00
                )

            [Consultant] => Array
                (
                    [0] => Array
                        (
                            [id] => 11111
                            [parent_id] => 22222
                            [statistic_date] => 2011-12-15 00:00:00
                        )
                    [1] => Array
                        (
                            [id] => 33333
                            [parent_id] => 22222
                            [statistic_date] => 2011-12-14 00:00:00
                        )
                )
      )
)
你是如何做到的?我能想到的可能解决方案是使用contain或Hash::class,但不知道如何使用


我们将非常感谢您在这件事上的任何帮助。

必须在同步模型上进行查找,以获得所需的效果,我将首先尝试包含。按照本页上的说明为Containeable设置模型

然后你会有这样的东西

$this->Sync->find('all', 
 array(
    'contain'=> 
         array('Consultant'=>
                       array(
                         'conditions' => 
                           array(
                              'Consultant.statistic_date BETWEEN ? AND ?' => 'array(
                                 '2011-12-01 00:00:00', '2011-12-31 00:00:00'
                                 )'
                                )
                            )


              )
      )
);

必须在同步模型上进行查找以获得所需的效果,我会首先尝试包含。按照本页上的说明为Containeable设置模型

然后你会有这样的东西

$this->Sync->find('all', 
 array(
    'contain'=> 
         array('Consultant'=>
                       array(
                         'conditions' => 
                           array(
                              'Consultant.statistic_date BETWEEN ? AND ?' => 'array(
                                 '2011-12-01 00:00:00', '2011-12-31 00:00:00'
                                 )'
                                )
                            )


              )
      )
);

好的,我减少了同步中的行数,这就是它给我的:

array(
(int) 0 => array(
    'Sync' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Unit' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Consultant' => array(
        (int) 0 => array(
            'id' => '11111',
            'parent_id' => '11111',
            'statistic_date' => '2012-12-11 00:00:00'
        ),
        (int) 1 => array(
            'id' => '22222',
            'parent_id' => '11111',
            'statistic_date' => '2011-12-14 00:00:00'
        ),
        (int) 2 => array(
            'id' => '33333',
            'parent_id' => '11111',
            'statistic_date' => '2011-12-15 00:00:00'
        )
    )
),
(int) 1 => array(
    'Sync' => array(
        'id' => '22222',
        'parent_id' => '11111',
        'language_code' => null,
        'statistic_date' => '2011-12-14 00:00:00'
    ),
    'Unit' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Consultant' => array()
),
(int) 2 => array(
    'Sync' => array(
        'id' => '33333',
        'parent_id' => '11111',
        'statistic_date' => '2011-12-15 00:00:00'
    ),
    'Unit' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'language_code' => null,
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Consultant' => array()
)
Array
(
    [0] => Array
        (

            [Sync] => Array
                (
                    [id] => 22222
                    [parent_id] => 22222
                    [statistic_date] => 2012-11-14 00:00:00
                )

            [Consultant] => Array
                (
                    [0] => Array
                        (
                            [id] => 11111
                            [parent_id] => 22222
                            [statistic_date] => 2011-12-15 00:00:00
                        )
                    [1] => Array
                        (
                            [id] => 33333
                            [parent_id] => 22222
                            [statistic_date] => 2011-12-14 00:00:00
                        )
                )
      )
)
)

这更接近于我想要实现的目标,但并不确切。我不想显示同步模型,我只想显示数组[0],其余的都不想显示

使用Hash::extract($data'{n}.Consultant')可以得到:

)

此外,如果id=parent\u id所在的行不存在,则该行上的Hash::filter()将给出令人满意的结果

Hash::filter()提供:


)

好的,我减少了同步中的行数,这就是它给我的:

array(
(int) 0 => array(
    'Sync' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Unit' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Consultant' => array(
        (int) 0 => array(
            'id' => '11111',
            'parent_id' => '11111',
            'statistic_date' => '2012-12-11 00:00:00'
        ),
        (int) 1 => array(
            'id' => '22222',
            'parent_id' => '11111',
            'statistic_date' => '2011-12-14 00:00:00'
        ),
        (int) 2 => array(
            'id' => '33333',
            'parent_id' => '11111',
            'statistic_date' => '2011-12-15 00:00:00'
        )
    )
),
(int) 1 => array(
    'Sync' => array(
        'id' => '22222',
        'parent_id' => '11111',
        'language_code' => null,
        'statistic_date' => '2011-12-14 00:00:00'
    ),
    'Unit' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Consultant' => array()
),
(int) 2 => array(
    'Sync' => array(
        'id' => '33333',
        'parent_id' => '11111',
        'statistic_date' => '2011-12-15 00:00:00'
    ),
    'Unit' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'language_code' => null,
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Consultant' => array()
)
Array
(
    [0] => Array
        (

            [Sync] => Array
                (
                    [id] => 22222
                    [parent_id] => 22222
                    [statistic_date] => 2012-11-14 00:00:00
                )

            [Consultant] => Array
                (
                    [0] => Array
                        (
                            [id] => 11111
                            [parent_id] => 22222
                            [statistic_date] => 2011-12-15 00:00:00
                        )
                    [1] => Array
                        (
                            [id] => 33333
                            [parent_id] => 22222
                            [statistic_date] => 2011-12-14 00:00:00
                        )
                )
      )
)
)

这更接近于我想要实现的目标,但并不确切。我不想显示同步模型,我只想显示数组[0],其余的都不想显示

使用Hash::extract($data'{n}.Consultant')可以得到:

)

此外,如果id=parent\u id所在的行不存在,则该行上的Hash::filter()将给出令人满意的结果

Hash::filter()提供:


)好的,我解决了这个问题。这就是我所做的。我动态绑定模型:

App::uses('AppModel', 'Model');

    class Sync extends AppModel {
    function unit() {
        $this->bindModel(array(
            'hasMany' => array(
                'Consultant' => array(
                    'className' => 'Sync',
                    'conditions' => array(
                        'Consultant.statistic_date BETWEEN ? AND ?' => array('2011-12-01 00:00:00', '2011-12-31 00:00:00')
                    ),
                    'foreignKey' => 'parent_id'
                )
            )
        ));

        return $this->find('all', array(
            'conditions' => array(
                'Sync.id = Sync.parent_id'
            )
        ));
    }
}
这给了我:

array(
(int) 0 => array(
    'Sync' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Unit' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Consultant' => array(
        (int) 0 => array(
            'id' => '11111',
            'parent_id' => '11111',
            'statistic_date' => '2012-12-11 00:00:00'
        ),
        (int) 1 => array(
            'id' => '22222',
            'parent_id' => '11111',
            'statistic_date' => '2011-12-14 00:00:00'
        ),
        (int) 2 => array(
            'id' => '33333',
            'parent_id' => '11111',
            'statistic_date' => '2011-12-15 00:00:00'
        )
    )
),
(int) 1 => array(
    'Sync' => array(
        'id' => '22222',
        'parent_id' => '11111',
        'language_code' => null,
        'statistic_date' => '2011-12-14 00:00:00'
    ),
    'Unit' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Consultant' => array()
),
(int) 2 => array(
    'Sync' => array(
        'id' => '33333',
        'parent_id' => '11111',
        'statistic_date' => '2011-12-15 00:00:00'
    ),
    'Unit' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'language_code' => null,
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Consultant' => array()
)
Array
(
    [0] => Array
        (

            [Sync] => Array
                (
                    [id] => 22222
                    [parent_id] => 22222
                    [statistic_date] => 2012-11-14 00:00:00
                )

            [Consultant] => Array
                (
                    [0] => Array
                        (
                            [id] => 11111
                            [parent_id] => 22222
                            [statistic_date] => 2011-12-15 00:00:00
                        )
                    [1] => Array
                        (
                            [id] => 33333
                            [parent_id] => 22222
                            [statistic_date] => 2011-12-14 00:00:00
                        )
                )
      )
)

好的,我解决了这个问题。这就是我所做的。我动态绑定模型:

App::uses('AppModel', 'Model');

    class Sync extends AppModel {
    function unit() {
        $this->bindModel(array(
            'hasMany' => array(
                'Consultant' => array(
                    'className' => 'Sync',
                    'conditions' => array(
                        'Consultant.statistic_date BETWEEN ? AND ?' => array('2011-12-01 00:00:00', '2011-12-31 00:00:00')
                    ),
                    'foreignKey' => 'parent_id'
                )
            )
        ));

        return $this->find('all', array(
            'conditions' => array(
                'Sync.id = Sync.parent_id'
            )
        ));
    }
}
这给了我:

array(
(int) 0 => array(
    'Sync' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Unit' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Consultant' => array(
        (int) 0 => array(
            'id' => '11111',
            'parent_id' => '11111',
            'statistic_date' => '2012-12-11 00:00:00'
        ),
        (int) 1 => array(
            'id' => '22222',
            'parent_id' => '11111',
            'statistic_date' => '2011-12-14 00:00:00'
        ),
        (int) 2 => array(
            'id' => '33333',
            'parent_id' => '11111',
            'statistic_date' => '2011-12-15 00:00:00'
        )
    )
),
(int) 1 => array(
    'Sync' => array(
        'id' => '22222',
        'parent_id' => '11111',
        'language_code' => null,
        'statistic_date' => '2011-12-14 00:00:00'
    ),
    'Unit' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Consultant' => array()
),
(int) 2 => array(
    'Sync' => array(
        'id' => '33333',
        'parent_id' => '11111',
        'statistic_date' => '2011-12-15 00:00:00'
    ),
    'Unit' => array(
        'id' => '11111',
        'parent_id' => '11111',
        'language_code' => null,
        'statistic_date' => '2012-12-11 00:00:00'
    ),
    'Consultant' => array()
)
Array
(
    [0] => Array
        (

            [Sync] => Array
                (
                    [id] => 22222
                    [parent_id] => 22222
                    [statistic_date] => 2012-11-14 00:00:00
                )

            [Consultant] => Array
                (
                    [0] => Array
                        (
                            [id] => 11111
                            [parent_id] => 22222
                            [statistic_date] => 2011-12-15 00:00:00
                        )
                    [1] => Array
                        (
                            [id] => 33333
                            [parent_id] => 22222
                            [statistic_date] => 2011-12-14 00:00:00
                        )
                )
      )
)

当尝试此功能时,应用程序将永远工作。我是说,几分钟,却没有收到任何东西。我在syncs表中有大约22000行,但我认为这不是问题所在。有没有其他方法可以解决这个问题?您是否尝试过将recursive设置为-1。另一个选择是在尝试此操作时执行手动连接,因为应用程序将永远工作。我是说,几分钟,却没有收到任何东西。我在syncs表中有大约22000行,但我认为这不是问题所在。有没有其他方法可以解决这个问题?您是否尝试过将recursive设置为-1。另一个选项是手动连接。我们是否可以通过更改模型而不是使用自定义循环来组合[Sync]和[Consultant]阵列以获得一个组合阵列?我们是否可以通过更改模型而不是使用自定义循环来组合[Sync]和[Consultant]阵列以获得一个组合阵列