以Yii多模式形式获取第二个模型值时出错

时间:2012-02-17 18:16:32

标签: php mysql yii

我有这样的数据库

+------------------+
|     Invoices     |
+------------------+
| id               |
| customer_id (Fk) |
| description      |
+------------------+

+------------------+
|    Customers     |
+------------------+
| id               |
| firstname        |
| lastname         |
| description      |
+------------------+

根据我的要求,我做了multimodel。在那个多模型客户模型中加载了发票模型。现在发票控制器的actionCreate()就像这样

public function actionCreate()
  {
    $model=new Invoices;
    $customers = new Customers;

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);
    if (isset($_POST['Invoices'],$_POST['Customers']))
    {
      $model->attributes = $_POST['Invoices'];
      $customers->attributes = $_POST['Customers'];
      $valid = $model->validate();
      $valid = $customers->validate();
      if($valid)
      {
        $customers->save(false);
        $model->customer_id = $customers->getPrimaryKey();
        $model->save(false);
         $this->redirect(array('view','id'=>$model->id));
      }
    }
    $this->render('create',array(
      'model'=>$model,
      'customers' => $customers,
    ));
  }

actionView()看起来像这样

  public function actionView($id)
  {
    $this->render('view',array(
      'model'=>$this->loadModel($id),
      'customers'=>Invoices::model()->findByAttributes(array('id'=>$_GET['id']))->customer_id,
      ));
  }

现在,当我使用renderpartial渲染表单并在View文件中更改我的代码时,就像这样

 <?php $this->widget('zii.widgets.CDetailView', array(
  'data'=>$model,
  'attributes'=>array(
   'id',
   'customer_id',
    array(
      'label' => 'Firstname',
      'value' => $customers->firstname,
    ),
    array(
      'label' => 'Lastname',
      'value' => $customers->lastname,
    ),
    array(
      'label' => 'description',
      'value' => $customers->description,
    ),
  ),
)); ?>

它显示了这样的错误试图获取非对象的属性行'value'=&gt; $客户 - &GT;姓名, 那么有人可以告诉我错误的部分吗?欢迎任何帮助和建议。

4 个答案:

答案 0 :(得分:2)

我认为以下代码存在问题:

public function actionView($id)
  {
    $this->render('view',array(
      'model'=>$this->loadModel($id),
      'customers'=>Invoices::model()->findByAttributes(array('id'=>$_GET['id']))->customer_id,
      ));
  }

试试这段代码:

public function actionView($id)
  {
    $model = $this->loadModel($id);
    $this->render('view',array(
      'model'=>$model,
      'customers'=>Customers::model()->findByAttributes(array('id'=>$model->customer_id)),
      ));
  }

答案 1 :(得分:1)

Invoices模型中客户关系的名称是什么?我们说它是customs。你可以试试这个:

  <?php $this->widget('zii.widgets.CDetailView', array(
  'data'=>$model,
  'attributes'=>array(
   'id',
   'customer_id',
    array(
      'label' => 'Firstname',
      'value' => $model->customs->firstname,
    ),
    array(
      'label' => 'Lastname',
      'value' => $model->customs->lastname,
    ),
    array(
      'label' => 'description',
      'value' => $model->customs->description,
    ),
  ),
)); ?>

但是当然你必须用关系的实际名称替换customs

答案 2 :(得分:0)

此错误表示您正在尝试访问非对象。最有可能的是,它不是从渲染它的位置填充的。 一定要遵循

  1. echo CVarDumper($_GET['id'],100,true)
  2. echo CVarDumper($customers,100,true)
  3. 让我们知道那里有什么。

    所以actionView()应该是这样的

      public function actionView($id)
      {
        $this->render('view',array(
          'model'=>$this->loadModel($id),
          `echo CVarDumper($_GET['id'],100,true)`
          yii::app()->end();
          'customers'=>Invoices::model()->findByAttributes(array('id'=>$_GET['id']))->customer_id,
          ));
      }
    

    显示它显示的内容。

    步骤2将上述代码撤消到您的原始代码,然后添加

    echo CVarDumper($customers,100,true)
    yii::app()->end(); 
    

    <?php $this->widget('zii.widgets.CDetailView', array(.....
    

    然后检查显示的内容

答案 3 :(得分:0)

更改

  'customers'=>Invoices::model()->findByAttributes(array('id'=>$_GET['id']))->customer_id,

  'customers'=>Invoices::model()->findByAttributes(array('id'=>$_GET['id'])),

如果findByAttributes返回null,您可能仍会得到相同的错误。因此,在执行$ customers-&gt; firstname。

之前,您必须检查$ customers是否为null