1

(後で)複数のデータベースを使用するYiiモデルがあり、テーブルプレフィックスはコードに基づいています。

例えば:

AMI_tablename、BMI_AMI_tablename など

これらのすべてのテーブルは同じですが、異なるデータベースにあります。

実行時に動的テーブル名を Yii モデルに提供する方法を知りたいですか?

セッター関数を使用しようとしましたが、親クラス CActiveRecord は子モデル クラスから値を取得しないため、エラーが発生します。

ここに私のモデルコードがあります(私が問題を抱えている部分のみ)

class RevShareModel extends CActiveRecord
{

    public $prefix;

    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }

    /**
     * @return string the associated database table name
     */
    public function tableName()
    {
        return $this->prefix . '_revshare_model';
    }

今、私のコントローラーのどこかに

$obj = RevShareModel::model();
$obj->prefix ="BMI";
$obj->tableName();
$obj->findByPk(1);

exit;

しかし、エラーが発生するのは次のとおりです。

CDbException

The table "_revshare_model" for active record class "RevShareModel" cannot be found in the database.

C:\wamp\www\framework\db\ar\CActiveRecord.php(2264)

tableName() メソッドが CActiveRecord によって呼び出されると、$prefix が取得されないようです。

4

5 に答える 5

5

テーブル名が実際にはモデルのメタデータに格納されているため、このようなエラーが発生しました。$model->getMetaData()これは、返さCActiveRecordMetaDataれるオブジェクトの内容を確認することで確認できます。メタデータを更新する$model->refreshMetaData()には、モデルの 'prefix' 属性を変更した後に呼び出す必要があります。

...
$obj->prefix ="BMI";
$obj->refreshMetadata();
...

これは間違いなくうまくいきます。

于 2013-11-13T21:28:06.760 に答える
2

メソッドをオーバーライドする必要がありますCActiveRecord::tableName(おそらく、モデルの抽象基本クラスで)。デフォルトでの動作は次のとおりです。

public function tableName()
{
    return get_class($this);
}

そして、これを次のように変更できます。

abstract class MyActiveRecord extends CActiveRecord
{
    public $prefix; // should probably be private, your call

    public function tableName()
    {
        return $prefix.'_'.get_class($this);
    }
}
于 2012-04-17T06:59:10.753 に答える
1

これが私がその問題を解決した方法です。

private static $_tableName;

public function __construct($tableName)
{
    if(strlen($tableName) == 0)
    {
        return false;
    }

    if(strlen($tableName)>0){
        self::$_tableName = $tableName;
    }

    self::setIsNewRecord(true);
}

public static function model($tableName)
{
    if(strlen($tableName) == 0)
    {
        return false;
    }

    $className=__CLASS__;

    if(strlen($tableName)>0){
        self::$_tableName = $tableName;
    }

    return parent::model($className);
}

public function tableName()
{
    return '{{'.self::$_tableName.'}}';
}

public function setTableName($tableName)
{
    self::$_tableName = $tableName;
}

...

このモデルを使用するときは、単純にテーブルの名前を括弧で囲みます。

$model = new ClassName($tableName);
于 2012-08-17T19:38:30.503 に答える
0

と一緒に使えますがMyModel::model()->tableName()、忘れずに書いてください{{table}}

于 2014-03-14T08:28:25.753 に答える