0

eventsのリストを返し、cityそれが行われている場所を含めようとしています。都市は、イベントを通じてのみ関連付けられVenueます。

以下は私が使用しているコードです。すべての正しいデータが返されますが、都市データは返されません (Venue の city_id フィールド以外 - なぜ返されるのかわかりません)。

協会:

Event belongsTo Venue
Venue hasMany Event

Venue belongsTo City    
City hasMany Venue

コード:

        $this->Event->Behaviors->attach('Containable');
        $events = $this->Event->find('all', array(
            'limit' => 5,
            'order' => 'Event.created DESC',
            'fields' => array(
                'name',
                'description',
                'phone',
                'price_general',
                'price_child',
                'price_adult',
                'price_child',
                'tickets_url'
            ),
            'contain' => array(
                'Venue' => array(
                    'fields' => array(
                        'name',
                        'address',
                        'city_id',
                    ),
                    'City' => array(
                        'fields' => array(
                            'City.name',
                            'state'
                        ),
                        'conditions' => array(
                            'City.id' => 'Venue.city_id'
                        )
                    )
                ),
                'Schedule' => array(
                    'fields'=>array(),
                    'Date' => array(
                        'conditions'=>array(
                            'Date.start >=' => $start_date,
                            'Date.start <=' => $end_date,
                        )
                    )
                )
            ),
        ));

おまけの答え: (私は現在、別の StackOverflowの質問で尋ねています) - 日付条件は、表示されるイベントをフィルター処理することになっていますが、代わりに、表示する日付データのみをフィルター処理しています。


有効な回答: (バンサーに感謝)

    $this->Event->recursive = -1;
    $options['joins'] = array(
            array('table' => 'schedules',
                'alias' => 'Schedule',
                'type' => 'LEFT',
                'conditions' => array(
                    'Event.id = Schedule.event_id',
                )
            ),
            array('table' => 'dates',
                'alias' => 'Date',
                'type' => 'LEFT',
                'conditions' => array(
                    'Date.schedule_id = Schedule.id',
                )
            )
        );
        $options['fields'] = array(
            'Event.name',
            'Schedule.start_date',
            'Date.start',
        );
        $options['limit'] = 5;
        $events = $this->Event->find('all', $options);
4

2 に答える 2

1

Containable の使用は避けることをお勧めします。場合によっては、生成されるクエリが多すぎます。複雑なクエリのより良い方法は、テーブルを「手動で」結合することです。

最初に検討する別のオプションは、次のように Containable を使用せずに「会場」モデルを検索することです$this->Event->Venues->find('all', ...)。都市やイベントに直接関連する会場として、余分な複雑さなしに必要なものを手に入れることができるはずです.

更新: CakePHP で「結合」のシーケンスを変更するにはどうすればよいですか?という質問を見てください。

于 2011-06-16T22:21:55.947 に答える
0

収容可能の代わりに、fields=> array('','','City.name) によってフィールド自体に都市データを含めようとしましたか

于 2011-06-16T21:32:36.620 に答える