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();
所以去掉也是一种解决方法
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();
所以去掉也是一种解决方法