0

我有以下模型:

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
                        )
                )
      )
)

你如何做到这一点?我能想到的可能解决方案是使用包含或 Hash:: 类,但不知道如何。

对于此事的任何帮助将不胜感激。

4

3 回答 3

2

必须在 Sync 模型上进行查找才能获得所需的效果,我会先尝试包含。按照此页面上的说明将模型设置为可包含。http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html

然后你会有这样的东西。

$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'
                                 )'
                                )
                            )


              )
      )
);
于 2012-12-10T13:49:28.363 回答
1

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

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
(
    [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
                        )
                )
      )
)
于 2012-12-18T12:06:41.853 回答
0

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

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()
)

)

这更接近我想要实现的目标,但不完全是。我不想显示 Sync 模型,我只显示数组 [0],而不是其余的。

使用 Hash::extract($data '{n}.Consultant') 给出:

 array(
(int) 0 => 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(),
(int) 2 => array()

)

此外,如果只有 id = parent_id 的行不存在,则对此的 Hash::filter() 将给出令人满意的结果。

Hash::filter() 给出:

array(
(int) 0 => 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'
    )
)

)

于 2012-12-11T12:30:55.227 回答