0

CodeIgniter アプリケーションに ORM を実装しようとしていますが、うまくいきません。まず、単純なテスト モデルをインスタンス化しようとしています。

<?php

class Cart extends DataMapper
{

    public function __construct()
    {
        // model constructor
        parent::__construct();
    }

    var $validation = array(
        'username' => array(
            'label' => 'UserName',
            'rules' => array('required', 'trim', 'unique', 'alpha_dash', 'min_length' => 1, 'max_length' => 50),
        )
    );
}

?>

そして、コントローラーでこれを試します:

public function __construct()
{
    parent::__construct();
    $this->load->model('cart');
}

public function index()
{   

    $cart = new Cart();
}

しかし、コンストラクターを通過することさえできません。デバッガーが停止し、「ide キー xxxxx との着信接続を待機しています」(乱数) というメッセージが表示されます。

ところで、カート モデルのクラス ファイル名は小文字ですが、クラス名は大文字です。コンストラクターで両方を試しました。

インストールの手順に注意深く従い、2 つのデータマッパー ファイルをライブラリと構成フォルダーにコピーし、データマッパー ライブラリを自動ロードしました。

しかし、それはうまくいきません。何か不足していますか?マップしようとしているテーブルは、実際には id フィールドとユーザー名フィールドしかないテスト テーブルです。検証配列を実際には理解していませんが、ドキュメントの例に従って、自分のフィールドに変更しました。id フィールドは、誰も検証配列に入れていないようです。

また、私は CodeIgniter の初心者です。

4

2 に答える 2

2

あなたのコードは、DataMapper ORM および CodeIgniter で使用するのにほとんど正しいようです。

少し説明すると、DataMapper は単なる抽象化レイヤーです。データベースを操作し、オブジェクトをテーブルにマッピングするときに必要な多くの処理を処理します。そうは言っても、モデルなどをロードする必要はありません。データベース ライブラリとデータマッパー ライブラリを自動ロードしている限り、DataMapper を使用できます。

検証配列により、DataMapper はプロパティに対する要件を認識できます。したがって、オブジェクトを保存しようとして、作成または変更したプロパティの 1 つがこれらの要件を満たしていない場合、保存は失敗し、エラー メッセージが表示されます。

// For example
if ($myObj->save())
{
    // $myObj validation passed and is saved to db
}
else
{
    // $myObj validation failed, save did not complete
    echo $myObj->error->string;
}

Codeigniter には既に という名前のライブラリがあるCartため、モデルに という名前を付けたくないでしょうCartBasketそのため、そのモデルの名前を、または意味のある別の名前に変更できます。

あなたがまだ物事を機能させようとしているだけであることは知っていますが、データ構造について少し考える必要があると感じています. オブジェクトに を保存しないので、usernameリレーションCartを使用します。したがって、次のように少し構成します。

// baskets table (a table represents many baskets, therefore it is plural)
id
user_id
blah
blah
created
updated

// users table
id
username
email_address
created
updated

// basket model (a model represents 1 basket, therefore it is singular)
class Basket extends DataMapper
{
    public function __construct()
    {
        parent::__construct();
    }
    var $has_one = array('user'); // each basket belongs to one user
    var $validation = array(...);
}

// user model
class User extends DataMapper
{
    public function __construct()
    {
        parent::__construct();
    }
    var $has_many = array('basket'); // each user can have many baskets
    var $validation = array(...);
}

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

public function index()
{   
    $basket = new Basket();
    $basket->blah = 'whatever';
    $basket->save();
    // at this point, $basket is saved to the database
    // now let's add it to the user
    $user = new User();
    $user->where('id', 1)->get(1);
    // now we have a user
    // save the relationship to the basket
    $user->save($basket);
    // now $basket->user_id == 1

    // get the username from the basket
    $u = $basket->user->get();
    $username = $u->username;

    // yes, there are faster and shorter ways to write most of this,
    // but I think for beginners, this syntax is easier to understand
}
于 2011-10-18T14:41:49.770 に答える
0

モデルに関するCodeIgniterのドキュメントには、を呼び出すことでモデルをロードできると記載されています

$this->load->model('Model_name');

コンストラクターで、コントローラーでこのモデルにアクセスするには、

$this->Model_name->function();

したがって、コントローラーコードを次のように変更する必要があります

public function __construct()
{
    parent::__construct();
    $this->load->model('Cart');
}

public function index()
{   

    $this->Cart->functionCall();
}
于 2011-10-17T17:26:06.013 に答える