Yii 模型扩展/重载



我有一个具有一些属性和关系的客户模型,我有一个经销商模型。关键是经销商实际上是一个帐户,只有它有可能在其下拥有帐户。

实现这一点的最佳方法是什么,起初我有一个特殊的经销商类,它们之间的关系,但实际上我只想要一个帐户类,如果帐户是经销商,则使用经销商类。

帐户模型

<?php
/**
 * This is the model class for table "account".
 *
 * The followings are the available columns in table 'account':
 * @property string $id
 * @property string $reseller_id
 * @property string $name
 * @property string $invoice_id
 * @property boolean $is_reseller
 *
 * The followings are the available model relations:
 * @property Reseller $reseller
 * @property Contact[] $contacts
 * @property Domain[] $domains
 * @property HostingAccount[] $hostingAccounts
 * @property User[] $users
 */
class Account extends CActiveRecord {
    /**
     * Returns the static model of the specified AR class.
     * @param string $className active record class name.
     * @return Account the static model class
     */
    public static function model($className = __CLASS__) {
        return parent::model($className);
    }
    /**
     * @return string the associated database table name
     */
    public function tableName() {
        return 'account';
    }
    /**
     * @return array validation rules for model attributes.
     */
    public function rules() {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('name', 'required'),
            array('id, reseller_id', 'length', 'max' => 40),
            array('name', 'length', 'max' => 45),
            array('invoice_id', 'length', 'max' => 10),
            // The following rule is used by search().
            // Please remove those attributes that should not be searched.
            array('id, reseller_id, name, invoice_id', 'safe', 'on' => 'search'),
        );
    }
    /**
     * @return array relational rules.
     */
    public function relations() {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'reseller' => array(self::BELONGS_TO, 'Reseller', 'reseller_id'),
            'contacts' => array(self::HAS_MANY, 'Contact', 'account_id'),
            'domains' => array(self::HAS_MANY, 'Domain', 'account_id'),
            'hostingAccounts' => array(self::HAS_MANY, 'HostingAccount', 'account_id'),
            'users' => array(self::HAS_MANY, 'User', 'account_id'),
        );
    }
    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels() {
        return array(
            'id' => 'ID',
            'reseller_id' => 'Reseller',
            'name' => 'Name',
            'invoice_id' => 'Invoice',
        );
    }
    /**
     * Retrieves a list of models based on the current search/filter conditions.
     * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
     */
    public function search() {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.
        $criteria = new CDbCriteria;
        $criteria->compare('id', $this->id, true);
        $criteria->compare('reseller_id', $this->reseller_id, true);
        $criteria->compare('name', $this->name, true);
        $criteria->compare('invoice_id', $this->invoice_id, true);
        return new CActiveDataProvider($this, array(
                    'criteria' => $criteria,
                ));
    }
    /**
     * Adds UUID before the item is saved
     * 
     */
    public function beforeSave() {
        if ($this->isNewRecord)
            $this->id = new CDbExpression('UUID()');
        return parent::beforeSave();
    }
}

经销商模式

<?php
class Reseller extends Account
{
    /**
     * @return array relational rules.
     */
    public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
                        'reseller' => array(self::BELONGS_TO, 'Reseller', 'reseller_id'),
                        'contacts' => array(self::HAS_MANY, 'Contact', 'account_id'),
                        'domains' => array(self::HAS_MANY, 'Domain', 'account_id'),
                        'hostingAccounts' => array(self::HAS_MANY, 'HostingAccount', 'account_id'),
                        'users' => array(self::HAS_MANY, 'User', 'account_id'),
            'accounts' => array(self::HAS_MANY, 'Account', 'reseller_id'),
            'account' => array(self::BELONGS_TO, 'Account', 'account_id'),
        );
    }
}

首先请记住,ActiveRecord != 模型很容易混淆,当心!

另请查看此帖子

好的,现在,您可以有一些工厂方法为您提供所需的类,帐户或经销商,具体取决于您的逻辑,如果不是所有计数都可以是经销商,您可能还需要一些方法来确定这一点。 如"is_reseller"列或类似列。

最后,我从帐户到自身建立了关系并解决了它。

 /**
 * @return array relational rules.
 */
public function relations() {
    return array(
        'reseller' => array(self::BELONGS_TO, 'Account', 'account_id'),
        'users' => array(self::HAS_MANY, 'User', 'account_id'),
        'accounts' => array(self::HAS_MANY, 'Account', 'account_id'),
    );
}

我使用扩展类到模型来实现不同的方法,一个独特的先决条件是将此函数添加到新类中:

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

相关内容

  • 没有找到相关文章

最新更新