Yii2 — Попытка получить свойство необъекта с отношениями

просмотров / 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 } ?>

отношение в моделях / 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,
]);
}

Что я здесь делаю неправильно или отсутствует? Я просмотрел другие подобные вопросы, однако, похоже, все они связаны с виджетами или вводом файлов. Любая помощь приветствуется.

0

Решение

Есть два места, где вы можете иметь ошибку 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();

Так что удаление это тоже решение.

0

Другие решения

Других решений пока нет …