我从数据库中获取了大量的订单记录,我想将另一个字段(相关表(客户)中的列)添加到提取的记录中。
但是这个字段不会直接获取,因为它不是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()(虽然我认为它不会被编码),
有些部分我不明白吗?我怎么能实现这个目标呢?
答案 0 :(得分:1)
如果不修改CActiveRecord类,则无法做到这一点。在Yii中,默认情况下你不能使用魔术设定器和吸气剂。创建模型实例时,只会在属性列表中添加数据库列。
您可以通过覆盖模型文件中的getMetaData()来添加其他属性:
public function getMetaData(){
$data = parent::getMetaData();
$data->columns['CustomerName'] = array('name' => '...');
return $data;
}
答案 1 :(得分:-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' ) );
}
客户是表客户的CActiveRecord。然后,从表customer获取其他字段显示下一个代码:
$order = Orders::model()->find(100500); $customeName = $order->customer->CustomerName;
<强>已更新强>
或者您可以使用query builder,结果将在数组中:功能较少,但内存消耗较少,性能更高