0

私はCakePHP 1.3でカテゴリ - >製品との単純なモデル関係を持っています

Category多くを持っていますProducts

異なるコントローラーで取得するデータ配列にはわずかな違いがあります。データは、コントローラーProductで関連付けられたモデルとして取得されるとメイン プロダクト配列にあり、取得されるCategoriesと分離されProductsます。

たとえば、「Product1」を取得するには

Categories- $category['Product'][0]['title']

そしてProducts- $product[0]['Product']['title']

商品の表示に同じ要素を使用したいと思います。同じにするためだけに、どの配列方式を使用するかは問題ではありません。また、変更を行う適切な場所はどこですか? それらの配列を取得した後で変更することはできますが、それが最良の選択肢だとは思いません。

Categoriesコントローラーでカテゴリを取得すると、次のようになります。

// $this->Category->findById('12');
Array
(
[ProductCategory] => Array
    (
        [id] => 12
        [title] => Category 1
        [updated] => 2013-02-24 10:06:15
        [created] => 2013-02-24 10:06:15
    )
[Product] => Array
    (
        [0] => Array
            (
                [id] => 4
                [parent_id] => 12
                [title] => Product1
                [updated] => 2013-02-24 10:17:01
                [created] => 2013-02-24 09:12:59

            )

        [1] => Array
            (
                [id] => 6
                [parent_id] => 12
                [title] => Product2
                [updated] => 2013-02-24 10:16:54
                [created] => 2013-02-24 09:13:53

            )
)

そして、Productsコントローラー内のすべての製品を取得する場合:

// $this->Product->find('all');
Array
(
    [0] => Array
        (
            [Product] => Array
                (
                    [id] => 10
                    [parent_id] => 12
                    [title] => Product1
                    [updated] => 2013-02-24 10:16:42
                    [created] => 2013-02-24 09:16:35
                )

        )

    [1] => Array
        (
            [Product] => Array
                (
                    [id] => 8
                    [parent_id] => 12
                    [title] => Product2
                    [updated] => 2013-02-24 10:16:47
                    [created] => 2013-02-24 09:15:39
                )

        )
    )
)
4

3 に答える 3

1

あなたの発見の1つはafind('all')であり、もう1つはaですfindById()(これは を使用しますfind('first'))。

これらは両方とも異なる形式でデータを返します。これは、必要なアイテムが 1 つだけであり、アイテムのセットが不明であるfind('first')ことを知っているためです。find('all')

両方に使用find('all')できますが、1 つだけ必要か複数必要かによって制限を設定してください。その後、データはまったく同じように返されます。

どのコントローラーからデータを取得しても、返されるデータには影響しません。ただし、どちらのモデルでも同じです。同じモデルから検索を行っていることを確認してください。

例えば。

//in your ProductsController
$this->Product->find('all');

//in your CategoriesController
$this->Category->Product->find('all');

// in some other controller
$this->loadModel('Product);
$this->Product->find('all');

PS-しかし、コントローラーで「検索」を行わない方が良いです-モデルでメソッドを作成し、コントローラーから呼び出すので、代わりに$this->Product->find()($this->Product->getProducts()または呼び出したいものは何でも) )。(理由/例については、「ファットモデル、スキニーコントローラー」の詳細をお読みください...など)。

于 2013-02-24T16:09:37.523 に答える
0

または、「製品」を次のように表示する場合:

<?php

'Product' => array
    (
        [0] => array
            (
                'Product' => array
                    (
                        ...
                    )
            )
    )

?>

カテゴリ モデルからデータを取得する場合、関連するデータを手動で取得する必要があります。たとえば、次のようになります。

<?php

$this->Category->contain();
$cats = $this->Category->find('all');
foreach ($cats as &$cat) {
    $this->Category->Product->contain();  // You have to contain for each find.
    $cat['Product'] = $this->Category->Product->find('all', 
        array(
            'conditions' => array(
                'Product.category_id' => $cat['Category']['id']
            )
        )
    );
}

?>
于 2013-03-27T04:07:13.220 に答える
0

デイブの言うとおりです。違いは使用している方法です...関連データは常にマージされると主張していますが、「製品」モデルでの検索は関連データではないため、形式は常に異なります。

ここに来てしばらく経ちましたが、デイブが自分のことをよく知っていることに気づきました。:) クリーンで効率的なコードのためのファット モデル/スキニー コントローラー パラダイムに同意します。

変更した場合:

<?php

$this->Category->contain(array(
    'Product'
));
$this->Category->find('all', 
    array(
        'conditions' => array(
            'Category.id' => $id // 12 for your OP.
        ),
        'limit' => 1
    )
);

?>

あなたに与えるべきです:

<?php

array
    (
    [0] => array
        (
        'Category' => array
            (
            [id] => 12
            [title] => Category 1
            [updated] => 2013-02-24 10:06:15
            [created] => 2013-02-24 10:06:15
            ),
        'Product' => array
            (
                [0] => array
                    (
                    ...
                    ),
                [1] => array
                    (
                    ...
                    )
            )
    )
)

?>

間違っていたら訂正してください、ありがとう!

于 2013-03-27T03:56:44.973 に答える