Yii:尝试获取非对象属性

3

我找到了这个链接,但是我无法看出它与我的错误有什么关系.. 我是新手--尽管我知道这种借口是不可接受的,但在我在这里提问之前,我会先尝试找到解决方案。我希望你能帮助我。

所以我有这段代码,我将它放在视图中:

foreach ($budget as $budget):
            if (array_key_exists('year', $_GET)) {
                $criteria = new CDbCriteria;
                $criteria->condition = 'year = ' . $_GET['year'];
                $criteria->addCondition('mapping_id = '. $budget->id);
                $yearBudget = YearlyBudget::model()->find($criteria);
            } else {
                $yearBudget = new YearlyBudget;
            } 
 endforeach;

然后在那段代码之后,我只需简单地输出以下内容:
echo $yearBudget->budget;

然后我收到了一个"non-object"错误。我不理解,陷入了这段代码中。请帮忙,谢谢。

print_r($yearBudget):

YearlyBudget Object(
[_new:CActiveRecord:private] => 
[_attributes:CActiveRecord:private] => Array
    (
        [id] => 1
        [mapping_id] => 1
        [year] => 2012
        [budget] => 2000000
        [balance] => 2000000
        [created] => 2013-11-20 10:16:29
        [updated] => 
    )

[_related:CActiveRecord:private] => Array
    (
    )

[_c:CActiveRecord:private] => 
[_pk:CActiveRecord:private] => 1
[_alias:CActiveRecord:private] => t
[_errors:CModel:private] => Array
    (
    )

[_validators:CModel:private] => 
[_scenario:CModel:private] => update
[_e:CComponent:private] => 
[_m:CComponent:private] => 

啊,如果我的英语不好,对不起。

3个回答

2

我强烈建议使用CHtml::value()方法,详情请参考http://www.yiiframework.com/doc/api/1.1/CHtml#value-detail

echo CHtml::value($yearBudget, 'budget');

当涉及到多个相关对象时,这非常方便,您不需要检查每个相关模型的存在来访问其属性。

echo CHtml::value($budget, 'company.fiscalYear.creator.id');

1

在访问对象属性之前,请检查该对象是否为空。

if($yearBudget){
  echo $yearBudget->budget;
}else{
  echo "No Yearly Budget with given criteria";
}

如果您没有得到期望的结果,请仔细检查条件。
$criteria->condition = 'year = ' . $_GET['year'];
$criteria->addCondition('mapping_id = '. $budget->id);

啊,它可以工作了,谢谢...顺便问一下,这个和model()->exist有什么区别? - kurogawa
如果查找方法没有找到任何内容,它将返回null。如果您首先检查现有记录,您将确保有一个填充了数据的模型可供使用。 - Developerium

0

在使用您的标准查找模型后,您需要确保您拥有一个有效的模型:

foreach ($budget as $budget):
            if (array_key_exists('year', $_GET)) {
                $criteria = new CDbCriteria;
                $criteria->condition = 'year = ' . $_GET['year'];
                $criteria->addCondition('mapping_id = '. $budget->id);

                if(YearlyBudget::model()->exists($criteria)) // check if this exists
                    $yearBudget = YearlyBudget::model()->find($criteria);
                else
                    $yearBudget = new YearlyBudget; // or throw an exception or something
            } else {
                $yearBudget = new YearlyBudget;
            } 
 endforeach;

我尝试了,你是对的,它不存在。我不明白,我试图使用print_r()打印$yearBudget,它显示为数组.. 我将编辑帖子以展示print_r()的结果。 - kurogawa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接