Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php yii附加模型属性和It';s范围_Php_Yii - Fatal编程技术网

Php yii附加模型属性和It';s范围

Php yii附加模型属性和It';s范围,php,yii,Php,Yii,我正在从数据库中获取大量订单记录,我想在获取的记录中添加另一个字段,即相关表(customers)中的列 但是这个字段不会直接获取,因为它不是订单模型的一部分 因此,我在模型中添加了一个属性来保存这个额外的属性,并按如下方式进行选择: $criteria = new CDbCriteria(); $criteria->join = 'INNER JOIN customers c ON t.idCustomer = c.idCustomer'; $criteria-&

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

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

因此,我在模型中添加了一个属性来保存这个额外的属性,并按如下方式进行选择:

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


有什么我不明白的地方吗?如何实现这一点?

尝试使用yii的此功能:。你可以这样做:按课堂顺序:

}

其中Customer是表Customer的记录。然后,要从表customer show next code中获取其他字段,请执行以下操作:

已更新


或者您可以使用,结果将是阵列:功能更少,但性能更高,占用内存更少

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

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

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

我知道可以通过relation()中指定的名称访问相关记录,但我还需要其他东西!我需要取另一个列作为当前模型的一部分!我只需要取这个col,不需要提及$order->relation->CutomerName,我需要一个findAll,在编码之后。如果在大数据集中出现问题,则需要使用ActiveRecord,并使用所有需要的关系和字段构建自定义的select查询。它更快,消耗更少的内存。我认为更改元数据是个坏主意,我将尝试@CeratoR所说的命令生成器。
$order = Orders::model()->find(100500);
$customeName = $order->customer->CustomerName;
public function getMetaData(){
    $data = parent::getMetaData();
    $data->columns['CustomerName'] = array('name' => '...');
    return $data;
}