12883


以下の質問者です。  
[CakePHPのページネーション処理で検索条件が想定どおりに反映されない](https://ja.stackoverflow.com/questions/12770/cakephp%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%87%A6%E7%90%86%E3%81%A7%E6%A4%9C%E7%B4%A2%E6%9D%A1%E4%BB%B6%E3%81%8C%E6%83%B3%E5%AE%9A%E3%81%A9%E3%81%8A%E3%82%8A%E3%81%AB%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84/)

こちらのコントローラの記述で無事に変数$eventsの一覧は取得する事ができました。  
さらに発展させて、他のテーブルからデータを結合したのですが、今度はそちらのソーティングがうまくいかなくなってしまいました。

[code]

    // ページネーション
    $this->paginate = array(
        'limit' => 20,
        'paramType' => 'querystring',
        'conditions'=> array('Event.id' => $event_ids),
    );
    $events = $this->paginate('Event');
    
    //別のEvents_calendarに登録されているstartdateを結合
    　　 for($i=0; $i<count($events); $i++) {
            // カレンダーを結合
            $options = array('conditions' => array('Events_calendar.event_id' => $events[$i]['Event']['id']));
            $events_calendar = $this->Events_calendar->find('first', $options);
    
            if(isset($events_calendar['Events_calendar']['startdate'])) {
                $events[$i]['Event']['startdate'] = $events_calendar['Events_calendar']['startdate'];
    
                // startdateを年月日に分ける
                // 2015-05-03 00:00:00
                $tmp1_created = array();
                $tmp2_created = array();
                $tmp1_created = split(' ', $events[$i]['Event']['startdate']);
                $tmp2_created = split('-', $tmp1_created[0]);
                // イベント日をMM/DDに変更
                $event_date[$i] = $tmp2_created[1].'/'.$tmp2_created[2];
                $events[$i]['Event']['event_date'] = $event_date[$i];
    
            } else {
                $events[$i]['Event']['startdate'] = null;
            }
        }
        $this->set('events', $evetns);
    
[/code]

上記で取得した$eventsを`event_date`で日付が近い順にソーティングしたいのですが、想定している結果に繋がりません、、、、、

何か良い方法をご存知の方ご教授願います。


CC BY-SA 3.0
2015-07-31T06:25:46.993
12870
2015-07-31T12:03:40.727
2017-04-13T12:52:39.113
-1
8500
question
php cakephp
CakePHPでテーブル結合後、取得した要素のソーティング方法。


この場合、2つの解決方法が考えられます。

# 1\. Hash::sortを利用する

とりあえずで対処したいならこちらで。

<http://book.cakephp.org/2.0/ja/core-utility-libraries/hash.html#Hash::sort>

[code]

    $evetns = Hash::sort($evetns, '{n}.Event.startdate', 'asc');
    
[/code]

を、Viewへ変数をセットする前に入れておきます。

# 2\. アソシエーション(hasOne)を利用する

EventとEvents_calendarが同一DBに存在する場合は、若干手間ですがこちらの方がより良い実装になります。

<http://book.cakephp.org/2.0/ja/models/associations-linking-models-
together.html#hasone>

Eventモデルに対して、Events_calendarをhasOneで紐付けます。  
（`Events_calendar`というモデル名がすごく気になるのですが、ここではそのままで行きます。。

[code]

    <?php
    
    class Event extends Model {
        // ... (snip)
        public $hasOne = [
            'Events_calendar' => [
                'className' => 'Events_calendar',
                'foreignKey' => 'event_id',
            ],
        ];
        // ... (snip)
    }
    
[/code]

コントローラ側は以下のように書きます。

[code]

    // ページネーション
    $this->paginate = [
        'limit' => 20,
        'paramType' => 'querystring',
        'conditions'=> ['Event.id' => $event_ids],
        'order' => ['Events_calendar.startdate' => 'asc'],
        'recursive' => 1,
    ];
    $events = $this->paginate('Event');
    
[/code]

これで 'Events_calendar.startdate' の昇順に、

[code]

    [
       ['Event' => [ ... ], 'Events_calendar' => [ ... ]],
       ['Event' => [ ... ], 'Events_calendar' => [ ... ]],
    ]
    
[/code]

のような形でデータを取得できます。

補足:  
`'event_date'`
の生成については、View側で行うべき事象だと考えます。またフォーマットの方法については、`CakeTime::format()`か`TimeHelper::format()`を利用するとよいでしょう。

<http://book.cakephp.org/2.0/en/core-utility-
libraries/time.html#CakeTime::format>

[code]

    CakeTime::format($events[$i]['Events_calendar']['startdate'], '%m/%d');
    
[/code]


CC BY-SA 3.0
2015-07-31T11:05:13.500
12883
2015-07-31T11:05:13.500
2668
12870
answer