Yii2 - 试图获得 属性 的非对象关系

Yii2 - Trying to get property of non-object with relations

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,
    ]);
}

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

有两个地方可能会出错 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();

所以去掉也是一种解决方法