yii附加模型属性和它的范围


yii additional model attribute and It's scope

我正在从数据库中获取大量订单记录,我想向获取的记录添加另一个字段,即相关表(客户)中的列。

但此字段不会直接获取,因为它不是订单模型的一部分。

所以我向模型添加了一个属性来保存这个额外的属性,并像这样做了我的选择:

    $criteria = new CDbCriteria();
    $criteria->join = 'INNER JOIN customers c ON t.idCustomer = c.idCustomer';
    $criteria->select = 't.* , c.CustomerName AS CustomerName'; // CustomerName is the added attribute
    $data = Orders::model()->findAll($criteria);
    var_dump($data); // in here CustomerName is fetched,
    $data = CJSON::encode($data); // but not here, its not even part of encoded string!

我需要立即对其进行编码,并且我不想将afterFind()放入我的模型中(尽管我认为它不会被编码),

有什么部分我不明白吗? 我怎样才能实现这一点?

如果不修改CActiveRecord类,就无法做到这一点。在 Yii 中,默认情况下你不能使用魔术二传手和获取者。创建模型实例时,属性列表中仅添加数据库列。

您可以通过覆盖模型文件中的 getMetaData() 来添加其他属性:

public function getMetaData(){
    $data = parent::getMetaData();
    $data->columns['CustomerName'] = array('name' => '...');
    return $data;
}

尝试使用 yii: http://www.yiiframework.com/doc/guide/1.1/en/database.arr 的这个特性。你可以这样做:在类中 顺序:

public function relations()
{
    return array(
       'customer' => array(
                       self::HAS_ONE, 
                        'Customer', 
                        array('idCustomer' => 'idCustomer'
        )
     );

}

其中客户是表客户的记录。然后,要从表中获取其他字段,客户显示下一个代码:

$order = Orders::model()->find(100500);
$customeName = $order->customer->CustomerName;

更新

或者您可以使用查询生成器,结果将在数组中:功能更少,但性能更高,内存消耗更少