0

Codeigniter のモデルで再帰を使用したいのですが、再帰関数で使用するグローバル変数をどこで宣言すればよいかわかりません。

地理的分類順に並べた製品のカタログを表示しようとしています。地理的データベースは階層ツリーであり、場所には息子、孫、ひ孫などを含めることができるため、再帰が必要です (たとえば、ロンドンはイングランドの息子であり、イギリスの息子であり、ヨーロッパの息子です)。 )。

$arrCatalog再帰の最後に、すべての積を保持する変数を返したいと思います。だから私の他の質問は、最終的にその変数を返す方法ですか?

これが私のコードです(グローバル変数の処理方法がわからなかったため、まだテストされていません):

 class Catalogs_model extends CI_Model {

    public function __construct()
    {
        parent::__construct();

    }



function getCatalog($place_id, $prod_type)
{
    $sql =
        "SELECT id, heb_name, type FROM places p
        INNER JOIN places_relations r ON p.id = r.son
        WHERE father = ?
        ORDER BY sort_name";

    $query = $this->db->query($sql, $place_id);

    if($query->num_rows() > 0) {
        foreach ($query->result() as $place) {

                $sql2 =
                        "SELECT code, heb_title, price, place_id FROM products
                        INNER JOIN products_places ON prod_code=code
                        WHERE place_id = ? AND prod_type = ?";
                    $query2 = $this->db->query($sql, $place_id, $prod_type);

                    if($query2->num_rows() > 0) {
                            foreach ($query2->result() as $product) {
                                    $arrCatalog[] = $product; // $arrCatalog is the global variable I don't know where to declare and how to return.
                            }

                    $this->getCatalog($place['id'], $prod_type);

                    }

        }
    }

}



}
4

1 に答える 1

0

変数を現在のオブジェクト ($this) に渡すと、それをモデルに渡すか、コントローラーに渡すことができます。

class Catalogs_model extends CI_Model {
    public $arrCatalog = array();

    public function __construct() {
        parent::__construct();
    }

    function getCatalog($place_id, $prod_type) { 
    $sql = "SELECT ...";
    $query = $this->db->query($sql, $place_id);

    if($query->num_rows() > 0) {
        foreach ($query->result() as $place) {
            $sql2 = "...";
            $query2 = $this->db->query($sql, $place_id, $prod_type);

            if($query2->num_rows() > 0) {
                foreach ($query2->result() as $product) {
                    $this->arrCatalog[] = $product;
                 }
                 $this->getCatalog($place['id'], $prod_type);
             }
        }
    }
}

あなたのコントローラー:

$this->catalogs_model->getCatalog(2, 'hebBook');
$data['data_rows'] = $this->catalogs_model->arrCatalog;

テスト、モデルを次のように変更します....

class Catalogs_model extends CI_Model {
    public $arrCatalog = array();
    // add these variables for testing ....
    private $greeting = 'Hello'; // notice this is private?  You cannot access this from your controller but you can from anywhere within the Catalogs_model class.
    public $output = ''; // public 
    public $string = null; // public

    // your existing code ...

    function hello ()
    {
        $this->output = $this->greeting;
    }

    function hello_string ()
    {
        if($this->string)
        {
            $this->output = $this->greeting.' '.$string;
        }
    }
} // end class

コントローラーでテストします

$this->catalogs_model->hello(); // runs the hello function which sets the model->output
echo $this->catalogs_model->output;  // echos 'Hello'

echo '<br />'; // just so the output stands apart in your browser.

$this->catalogs_model->string = 'World!';
$this->catalogs_model->hello_string();
echo $this->catalogs_model->output;  // echos Hello World!
于 2012-12-17T22:08:25.020 に答える