1

CodeIgniter の初心者です。

Pizza テーブルと Ingredients テーブルのモデルを作成しました。テーブルは、追加の Pizza_Ingredients テーブルによって結合されます (多対多の関係)。

私のモデル:

<?php

class Pizza extends DataMapper {

    var $table = 'Pizza';

    var $has_many = 
        array(
        'ingredients' => 
            array(
            'class' => 'ingredients',
            'join_table' => 'pizza_ingredients'
            )
        );
}

class Ingredients extends DataMapper {

    var $table = 'Ingredients';
    var $has_many = 
        array(
            'pizza' => 
                array(
                'class' => 'pizza',
                'join_table' => 'pizza_ingredients'
             )
        );
}

?>

そのコードを使用してデータを取得すると:

$pm = new Pizza();
$pm->include_related('ingredients');
$array = $pm->get();

ピザの値が重複している配列を取得しています(SQLクエリの結果のように見えます)。

margherita    | cheese
vegetariana   | vegetable 1
vegetariana   | vegetable 2

このような配列の「foreach」でhtmlテーブルを単純に生成することはできません。

次のような構造を持つオブジェクトを取得したい:

margherita:
 - cheese

vegetariana:
 - vegetable 1
 - vegetable 2

これにより、「ピザループ」内で他の foreach ループ (食材を含む) を使用して foreach ループ (ピザを含む) を作成できます。

これを PHP で書かなければなりませんか、それとも CodeIgniter/DataMapper が私のために何かできるでしょうか?

何かアドバイス?

4

3 に答える 3

1

私は同じ答えで立ち往生しています...

そこで、CI Datamapper DOCを検索して、役立つものを見つけました(http://datamapper.wanwizard.eu/pages/getadvanced.html)。最初の例を見てください。

あなたの問題に翻訳すると、次のようになります:

    // Create pizza

    $pm = new Pizza();

    // DO NOT USE include_related to Ingredients Here !!!
    //Datamapper will DO THIS for you!
    // Remember to declare your Ingredients class in singular, not plural
    // So your class should be in singular -> Ingredient
    // And your DB Table should be in plural -> Ingredients
    // As CI Datamapper Guide teaches :)

    // Get all pizzas

    $pm->get();

    // Loop through all pizzas

    foreach ($pm as $pizza)
    {

    // Print the actual pizza name

            echo $pizza->name."<br/>";

            // Get the current pizza's Ingredients  <- Here is the magic comes!

            $pizza->ingredient->get();

            // Print all current pizza's Ingredients

            foreach ($pizza->ingredient as $ingredient)
            {
                    echo $ingredient->name."<br/>";
            }
    }

これは私には非常にうまく機能しますが、実際には、DBに含まれるピザごとに1回、何度もdbにヒットし続けます。

CIDatamapperを使用するソリューションがDBへのリクエストを少なくしてくれたら本当にありがたいです。

見つけたらシェアしてください!

于 2012-10-29T01:09:22.183 に答える
0

中間テーブルを使用して、多対多の関係を打破してみませんか。管理がはるかに簡単なようです。お気に入り:

TABLE pizza_ingredients
   id
   pizza_id
   ingredient_id

次に、次のようなことを試すことができます。

foreach($pizzas as $pizza)
    $pizza->ingredients = $this->get_ingredients($pizza->id);
于 2012-10-25T11:18:29.260 に答える
-1

現在使用しているピザの変数を設定し、次の反復でそれを確認できます。フォーマットなどはさまざまですが、これでアイデアが得られます。

foreach ($pizza as $k=>$p) {
    if ($last_pizza === $p->pizza) {
        echo "<tr>
            <td>
            </td>
        </tr>
        <tr>
            <td>
                $p->cheese
            </td>
        </tr>";
        $last_pizza = $p->pizza;
    }else{
        echo "<tr>
            <td>
                $p->pizza
            </td>
        </tr>
        <tr>
            <td>
                $p->cheese
            </td>
        </tr>";
        $last_pizza = $p->pizza;
    }
}
于 2012-10-25T05:52:35.117 に答える