2

私のアプリには、Burgerモデル、Jointモデル、モデルがありLocationます。

ジョイントには多くのハンバーガーがあり、多くの場所があります。

私がやりたいのは、ハンバーガーを2つの方法でフィルタリングすることです。1つは評価に基づいて、もう1つは条件に一致する場所(この場合は都市)を持つジョイントに属しているかどうかに基づいています。

これが私が試したことですが、彼女は働き者ではありません:

$burgers = $this->Burger->find('all', array(
    'conditions' => array('Burger.official_rating !=' => 0),
    'contain' => array(
        'Joint',
            'Joint.Location.conditions' => array(
                'Location.city' => 'Toronto'
            )
    ),
    'order' => array('Burger.official_rating DESC'),
    'limit' => 10
));

Joint.Location.conditions効果がないようです。

編集:現在は結合を使用していますが、これが最も効率的な方法かどうかはわかりません(関連データが結果に返されるように、Contain句を追加する必要がありました)。

$options['joins'] = array(
    array('table' => 'joints',
        'alias' => 'Joint1',
        'type' => 'inner',
        'conditions' => array(
            'Joint1.id = Burger.joint_id'
        )
    ),
    array('table' => 'locations',
        'alias' => 'Location2',
        'type' => 'inner',
        'conditions' => array(
            'Location2.joint_id = Burger.joint_id'
        )
    )
);

$options['conditions'] = array(
    'Location2.city' => 'Toronto',
    'Burger.official_rating !=' => 0
);

$options['order'] = array(
    'Burger.official_rating DESC',
);

$options['limit'] = 10;

$options['contain'] = array(
    'Joint','Joint.Location'
);

$burgers = $this->Burger->find('all', $options);
4

1 に答える 1

2

問題:

これは非常に一般的な問題ですが、含まれているアイテムに対する条件に基づいてメインの検索モデルを制限できないことを理解するとすぐに解決できます。

できない理由は、単一のクエリを作成するJOINとは対照的に、containを実行すると実際にはテーブルに個別のクエリが作成されるためです。

解決:

この場合の最善の策は、CakePHPJOINを使用することです。

場合によっては(自分のものではない)、JOINを使用する代わりに、クエリを実行しているモデルを変更することもできます。条件が1つだけ必要な場合は、検索を、contain内の条件ではなく条件付きのモデルに変更して、逆の順序でcontainすることができます。

于 2013-02-17T23:31:08.127 に答える