0

次のテーブルがあります。

- restaurants (restaurant.id, restaurant.name)
- menus (menu.id, menu.name, menu.active, menu.restaurant_id)

アクティブなメニュー (menu.active = true) を持つすべてのレストランのリストが必要です。

- restaurant2
    - menu1
    - menu4
- restaurant5
    -menu3
- restaurant19
    - menu34
    - menu33

私の最初のアイデアは次のようなものでした:

$options['contain'] = array(
    'Menu' => array(
        'conditions' => $menuParams //array('Menu.active' => '1') //$menuParams
        )
     );

すべてのレストランがリストされるため、これは機能しません。アクティブなメニューがあるレストランだけを持ちたいです。

次のアイデア: join の使用

$options['joins'] = array(
        array('table' => 'menus',
            'alias' => 'Menu',
            'type' => 'RIGHT',
            'conditions' => array(
                'Menu.restaurant_id = Restaurant.id',
            )
        )
    );

必要な順序付きリストがないため、良くありません。レストランごとにグループ化されたメニューが必要です。上を見てください。

レストランとメニュー (active = true) を結合してから、contain を使用して順序付きリストを取得するのは正しい方法ですか? それはうまくいくと思いますが、もっと簡単な方法もあると思いますよね?

どんな助けでも大歓迎です!ありがとうございました。

4

2 に答える 2

0

今、私は自分の懸念に対する簡単でクリーンな解決策を見つけました! うん!

最初にバインドをアンバインドしてから、その条件で新しいバインドを作成する必要がありました。それは魅力のように機能します。コードは次のとおりです。

        $this->unbindModel(array('hasMany' => array('Menu')));
        $this->bindModel(array('hasMany'=>array(
            'Menu'=>array(
                'foreignKey' => 'restaurant_id',
                'conditions' => array(
                                    'Menu.active' => 1
                                    )
            )
        )));

皆さんの回答に感謝します!

于 2013-03-24T13:50:22.043 に答える
0

CakePHP の ORM 機構を使用している場合は、各テーブルを記述するための Restaurant モデルと Menu モデルが必要です。レストラン モデルには$hasMany = "Menu"フィールドがあり、メニューにはフィールドが必要です (モデル名がと であると$belongsTo = "Restaurant"仮定します)。MenuRestaurant

その時点から、ORM を使用してクエリを実行するのは非常に簡単です。

$this->Restaurant->recursive = 1; // grab the menus
$conditions = array('Menu.active' => '1'); // restrict to active menus only
$this->Restaurant->find('all', array('conditions' => $conditions));

上記のコントローラーのアドホック メソッドではRestaurant、行をオブジェクトの配列として取得しRestaurant、それぞれが active の配列にバンドルされていMenuます。

于 2013-03-23T11:00:04.950 に答える