0

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

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

账户模式

<?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'),
        );
    }

}
4

3 回答 3

1

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

还要检查这个帖子

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

于 2012-10-14T23:04:25.533 回答
0

我对模型使用了扩展类来实现不同的方法,唯一的先决条件是在新类中添加这个函数:

public static function model($className=__CLASS__){
return parent::model($className);
}
于 2014-04-15T10:25:58.860 回答
0

最后,我建立了账户与自身的关系并解决了它。

 /**
 * @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'),
    );
}
于 2012-11-03T14:48:10.103 回答