3

分類されたリストでユーザーの食料品を見つけようとしています。関連付けは、カテゴリ hasMany Item hasMany User から Grocery です。Containable Behavior を使用していますが、他のすべての食料品を除外していません。基本的には一品ごとに返品します。

私のコントローラー機能:

function showlist() {
$categories = $this->Category->find('all', array(
    'contain' => array(
        'Item' => array(
            'Grocery' => array(
                'conditions' => array(
                    'Grocery.user_id =' => $this->Auth->user('id')
                )
            )
        )
    )
));

返される配列:

Array
(
    [0] => Array
        (
            [Category] => Array
                (
                    [id] => 10
                    [parent_id] => 
                    [name] => Dairy
                    [lft] => 1
                    [rght] => 6
                )

            [Item] => Array
                (
                )

        )

[1] => Array
    (
        [Category] => Array
            (
                [id] => 11
                [parent_id] => 10
                [name] => Milk
                [lft] => 2
                [rght] => 3
            )

        **[Item] => Array
            (
            )**

    )

[2] => Array
    (
        [Category] => Array
            (
                [id] => 12
                [parent_id] => 10
                [name] => Cheese
                [lft] => 4
                [rght] => 5
            )

        [Item] => Array
            (
            )

    )

[3] => Array

その下に Grocery(ItemUser) がない Item 配列を返したくありません。


これは機能しますが、今ではフラットにしか表示されません。そのネストされた配列内の 1 つのカテゴリのすべてのアイテムを表示する必要があります。

それは示しています:

Array
(
[0] => Array
    (
        [Category] => Array **<--This could be the same category as**
            (...)

        [Item] => Array
            (...)

        [Grocery] => Array
            (...)
    )
[1] => Array
    (
        [Category] => Array **<--This**
            (...)

        [Item] => Array
            (...)

        [Grocery] => Array
            (...)
    )
[2]...

そして、私はそれが必要です:

Array
(
[0] => Array
    (
        [Category] => Array 
            (...
            [Item] => Array
            (...)

            [Item] => Array
            (...)
            )
    )
[1] => Array
    (
        [Category] => Array
            (...)

        [Item] => Array
            (...)
    )
[2]...

Grocery 配列は実際には必要ありません。条件を検索するだけです。

4

2 に答える 2

6

Contain 内の条件に基づいてメイン モデルの結果を制限することはできません。を使用するcontain()と、実際には複数のクエリが作成されます。これにより、含まれている条件に基づいて制限することができなくなります。

これを解決するには、contain の代わりにJOIN [CakePHP Joining Tables を参照]を使用する必要があります。

于 2013-03-30T18:31:47.737 に答える
0

ネストされたフォーマットが必要な場合は、これらすべてを別の (例: Groceries) コントローラーに移動して、user_id または (しかし、これが Cake の良い慣習であるかどうかはわかりませんが、私は成功しましたが)このアプローチを使用しました... とにかく1.3で)次の行に沿ったもの:

$groceries = $this->Category->Item->Grocery->find('all', array(
    'conditions' => array(
         Grocery.user_id =' => $this->Auth->user('id')
    )
));
于 2013-04-02T13:15:46.310 に答える