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

どうやってそれを達成しますか?私が考えることができる可能な解決策は、contain または Hash:: クラスを使用することですが、方法がわかりません。

この問題の助けをいただければ幸いです。

4

3 に答える 3

2

目的の効果を得るには、同期モデルで検索を実行する必要があります。最初に包含を試みます。封じ込め可能なモデルを設定するには、このページの指示に従ってください。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

OK、同期の行数を減らしたところ、次のようになりました。

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

)

これは私が達成したいことに近いですが、正確ではありません。同期モデルを表示したくありません。また、配列 [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()

)

さらに、これに Hash::filter() を使用すると、id = parent_id の行だけが存在しなければ、満足のいく結果が得られます。

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 に答える