4

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

但是这个字段不会被直接获取,因为它不是 Orders 模型的一部分。

所以我在模型中添加了一个属性来保存这个额外的属性,我的选择是这样的:

    $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() 放入我的模型中(尽管我认为它不会被编码),

有没有我不明白的部分?我怎样才能做到这一点?

4

2 回答 2

1

如果不修改 CActiveRecord 类,您将无法做到这一点。默认情况下,在 Yii 中你不能使用魔法 setter 和 getter。当您创建模型的实例时,属性列表中只会添加数据库列。

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

public function getMetaData(){
    $data = parent::getMetaData();
    $data->columns['CustomerName'] = array('name' => '...');
    return $data;
}
于 2013-10-15T07:34:54.090 回答
-1

尝试使用 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'
        )
     );

}

其中 Customer 是表客户的 CActiveRecord。然后,为了从表 customer 中获取其他字段,请显示下一个代码:

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

更新

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

于 2013-10-15T07:13:12.830 回答