【问题标题】:Yii2 - Trying to get property of non-object with relationsYii2 - 试图获得具有关系的非对象的属性
【发布时间】:2017-08-01 14:00:46
【问题描述】:

views/search.php

<?php foreach($dataProvider->getModels() as $call){ ?>
<tbody>
<tr>
    <td><?=$call->created?></td>
    <td><?=$call->call_datetime?></td>
    <td><?=$call->call_from?></td>
    <td><?=$call->call_to?></td>
    <td><?=$call->duration?></td>
    <td><?=$call->call_type?></td>
    <td><?=$call->extension?></td>
   <td><?=$call->callRecFiles->fname?></td> 
</tr>
</tbody>
<?php } ?>

models/Call.php 中的关系

 public function getCallRecFiles()
{
    return $this->hasOne(CallRecording::className(), ['callref' => 'callref']);
}

控制器动作搜索

public function actionSearch($id)
{
    $cust = new Customer();
    Yii::$app->user->identity->getId();
    $dataProvider = new ActiveDataProvider([
        'query' => Call::find()
            ->with('customer', 'callRecFiles') // eager loading relations 'customer' & 'callRecFiles' 
            ->where(['custref' => $id])
            ->limit(10),
        'pagination' => false, // defaults to true | when true '->limit()' is automatically handled
    ]);
    return $this->render('search',[
        'dataProvider' => $dataProvider,
        'cust' => $cust,
    ]);
}

我在这里做错了什么或错过了什么?我浏览了其他类似的问题,但似乎都涉及小部件或文件输入。任何帮助表示赞赏。

【问题讨论】:

  • 错误是什么?
  • 试图获取非对象的属性
  • 在哪个模型->你有这个错误?
  • 不要像那样打印它们,而是运行 foreach()var_dump($call) 并查看属性是否存在。我猜是callRecFiles 给了你错误,看看它是否存在。你也可以试试if(isset($call-&gt;callRecFiles) echo $call-&gt;callRecFiles-&gt;fname

标签: php yii2 relationship yii2-advanced-app dataprovider


【解决方案1】:

有两个地方可能会出现错误Trying to get property of non-object

第一个在这里:

<td><?=$call->callRecFiles->fname?></td>

为避免这种情况,您应该使用if 声明:

<td><?= $call->callRecFiles ? $call->callRecFiles->fname : null ?></td>

第二个在这里:

Yii::$app->user->identity->getId();

如果您的控制器中没有访问控制规则,则未登录的用户可以访问此操作和搜索方法,因此在他登录之前您没有用户的identity。为避免这种情况,您应该添加behaviors到你的控制器:

/**
 * @inheritdoc
 */
public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::class,
            'rules' => [
                [
                    'allow'         => true,
                    'roles'         => ['@'],
                ],
            ],
        ],
    ];
}

在访问您在此控制器中的操作之前,需要用户登录。

顺便说一句,你根本没有使用这段代码:

Yii::$app->user->identity->getId();

所以去掉也是一种解决办法。

【讨论】:

  • 谢谢@Yupik 非常详细的回答。我忘了把它放在问题中,但错误来自&lt;td&gt;&lt;?=$call-&gt;callRecFiles-&gt;fname?&gt;&lt;/td&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
相关资源
最近更新 更多