我对 yii2 很陌生。我有 3 个表任务、活动和员工。每当我在 Activity 表中添加多于一行数据时,我都会收到以下错误 -
“获取未知属性:backend\models\Employee::Employee_ID”
我的 Activty 模型有这两个获取关系函数:
public function getTask()
{
return $this->hasOne(Tasks::className(), ['Task_ID' => 'Task_ID']);
}
public function getEmployee()
{
return $this->hasOne(Employee::className(), ['Employee_ID' => 'Employee_ID']);
}
在我的 _columns.php 中,我使用以下内容在 gridview 中获取员工姓名。但即使我对此发表评论,如果我在 Activity 表中有不止一行,我也会收到错误消息。
[
'attribute' => 'Employee_ID',
'value' => 'employee.employee_name',
],
有人可以帮我理解为什么会这样,我该如何解决这个问题?
谢谢
编辑:
添加了控制器
`
class ActivitiesController extends Controller
{
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'access'=>[
'class'=>AccessControl::classname(),
'only'=>['create','update'],
'rules'=>[
[
'allow'=>true,
'roles'=>['@']
],
]
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
'bulk-delete' => ['post'],
],
],
];
}
/**
* Lists all Activity models.
* @return mixed
*/
public function actionIndex()
{
$searchModel = new ActivitiesSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* Displays a single Activity model.
* @param integer $id
* @return mixed
*/
public function actionView($id)
{
$request = Yii::$app->request;
if($request->isAjax){
Yii::$app->response->format = Response::FORMAT_JSON;
return [
'title'=> "Activity #".$id,
'content'=>$this->renderAjax('view', [
'model' => $this->findModel($id),
]),
'footer'=> Html::button('Close',['class'=>'btn btn-default pull-left','data-dismiss'=>"modal"]).
Html::a('Edit',['update','id'=>$id],['class'=>'btn btn-primary','role'=>'modal-remote'])
];
}else{
return $this->render('view', [
'model' => $this->findModel($id),
]);
}
}
/**
* Creates a new Activity model.
* For ajax request will return json object
* and for non-ajax request if creation is successful, the browser will be redirected to the 'view' page.
* @return mixed
*/
public function actionCreate()
{
$request = Yii::$app->request;
$model = new Activity();
if($request->isAjax){
/*
* Process for ajax request
*/
Yii::$app->response->format = Response::FORMAT_JSON;
if($request->isGet){
return [
'title'=> "Create new Activity",
'content'=>$this->renderAjax('create', [
'model' => $model,
]),
'footer'=> Html::button('Close',['class'=>'btn btn-default pull-left','data-dismiss'=>"modal"]).
Html::button('Save',['class'=>'btn btn-primary','type'=>"submit"])
];
}else if($model->load($request->post()) && $model->save()){
return [
'forceReload'=>'#crud-datatable-pjax',
'title'=> "Create new Activity",
'content'=>'<span class="text-success">Create Activity success</span>',
'footer'=> Html::button('Close',['class'=>'btn btn-default pull-left','data-dismiss'=>"modal"]).
Html::a('Create More',['create'],['class'=>'btn btn-primary','role'=>'modal-remote'])
];
}else{
return [
'title'=> "Create new Activity",
'content'=>$this->renderAjax('create', [
'model' => $model,
]),
'footer'=> Html::button('Close',['class'=>'btn btn-default pull-left','data-dismiss'=>"modal"]).
Html::button('Save',['class'=>'btn btn-primary','type'=>"submit"])
];
}
}else{
/*
* Process for non-ajax request
*/
if ($model->load($request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->Activity_ID]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
}
/**
* Updates an existing Activity model.
* For ajax request will return json object
* and for non-ajax request if update is successful, the browser will be redirected to the 'view' page.
* @param integer $id
* @return mixed
*/
public function actionUpdate($id)
{
$request = Yii::$app->request;
$model = $this->findModel($id);
if($request->isAjax){
/*
* Process for ajax request
*/
Yii::$app->response->format = Response::FORMAT_JSON;
if($request->isGet){
return [
'title'=> "Update Activity #".$id,
'content'=>$this->renderAjax('update', [
'model' => $model,
]),
'footer'=> Html::button('Close',['class'=>'btn btn-default pull-left','data-dismiss'=>"modal"]).
Html::button('Save',['class'=>'btn btn-primary','type'=>"submit"])
];
}else if($model->load($request->post()) && $model->save()){
return [
'forceReload'=>'#crud-datatable-pjax',
'title'=> "Activity #".$id,
'content'=>$this->renderAjax('view', [
'model' => $model,
]),
'footer'=> Html::button('Close',['class'=>'btn btn-default pull-left','data-dismiss'=>"modal"]).
Html::a('Edit',['update','id'=>$id],['class'=>'btn btn-primary','role'=>'modal-remote'])
];
}else{
return [
'title'=> "Update Activity #".$id,
'content'=>$this->renderAjax('update', [
'model' => $model,
]),
'footer'=> Html::button('Close',['class'=>'btn btn-default pull-left','data-dismiss'=>"modal"]).
Html::button('Save',['class'=>'btn btn-primary','type'=>"submit"])
];
}
}else{
/*
* Process for non-ajax request
*/
if ($model->load($request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->Activity_ID]);
} else {
return $this->render('update', [
'model' => $model,
]);
}
}
}
/**
* Delete an existing Activity model.
* For ajax request will return json object
* and for non-ajax request if deletion is successful, the browser will be redirected to the 'index' page.
* @param integer $id
* @return mixed
*/
public function actionDelete($id)
{
$request = Yii::$app->request;
$this->findModel($id)->delete();
if($request->isAjax){
/*
* Process for ajax request
*/
Yii::$app->response->format = Response::FORMAT_JSON;
return ['forceClose'=>true,'forceReload'=>'#crud-datatable-pjax'];
}else{
/*
* Process for non-ajax request
*/
return $this->redirect(['index']);
}
}
/**
* Delete multiple existing Activity model.
* For ajax request will return json object
* and for non-ajax request if deletion is successful, the browser will be redirected to the 'index' page.
* @param integer $id
* @return mixed
*/
public function actionBulkDelete()
{
$request = Yii::$app->request;
$pks = explode(',', $request->post( 'pks' )); // Array or selected records primary keys
foreach ( $pks as $pk ) {
$model = $this->findModel($pk);
$model->delete();
}
if($request->isAjax){
/*
* Process for ajax request
*/
Yii::$app->response->format = Response::FORMAT_JSON;
return ['forceClose'=>true,'forceReload'=>'#crud-datatable-pjax'];
}else{
/*
* Process for non-ajax request
*/
return $this->redirect(['index']);
}
}
/**
* Finds the Activity model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* @param integer $id
* @return Activity the loaded model
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($model = Activity::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
}
`
下面的index.php
`
<div class="activity-index">
<div id="ajaxCrudDatatable">
<?=GridView::widget([
'id'=>'crud-datatable',
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'pjax'=>true,
'columns' => require(__DIR__.'/_columns.php'),
'toolbar'=> [
['content'=>
Html::a('<i class="glyphicon glyphicon-plus"></i>', ['create'],
['role'=>'modal-remote','title'=> 'Create new Activities','class'=>'btn btn-default']).
Html::a('<i class="glyphicon glyphicon-repeat"></i>', [''],
['data-pjax'=>1, 'class'=>'btn btn-default', 'title'=>'Reset Grid']).
'{toggleData}'.
'{export}'
],
],
'striped' => true,
'condensed' => true,
'responsive' => true,
'panel' => [
'type' => 'primary',
'heading' => '<i class="glyphicon glyphicon-list"></i> Activities listing',
'before'=>'<em>* Resize table columns just like a spreadsheet by dragging the column edges.</em>',
'after'=>BulkButtonWidget::widget([
'buttons'=>Html::a('<i class="glyphicon glyphicon-trash"></i> Delete All',
["bulk-delete"] ,
[
"class"=>"btn btn-danger btn-xs",
'role'=>'modal-remote-bulk',
'data-confirm'=>false, 'data-method'=>false,// for overide yii data api
'data-request-method'=>'post',
'data-confirm-title'=>'Are you sure?',
'data-confirm-message'=>'Are you sure want to delete this item'
]),
]).
'<div class="clearfix"></div>',
]
])?>
</div>
</div>
<?php Modal::begin([
"id"=>"ajaxCrudModal",
"footer"=>"",// always need it for jquery plugin
])?>
<?php Modal::end(); ?>
`
下面的view.php
`
<div class="activity-view">
<?= DetailView::widget([
'model' => $model,
'attributes' => [
'Activity_ID',
'Activity_name',
'Activity_description',
'Due_Date',
'Status',
'Task_ID',
// 'Employee_ID',
],
]) ?>
</div>
`
表架构如下
活动表
Field Type Null Key Default Extra
Activity_ID int(11) NO PRI NULL auto_increment
Activity_name varchar(100) NO NULL
Activity_description varchar(255) NO NULL
Due_Date date NO NULL
Status enum('Open','Completed','Closed') NO NULL
Task_ID int(11) NO NULL
Employee_ID int(11) NO NULL
员工表
Field Type Null Key Default Extra
employee_ID int(11) NO PRI NULL auto_increment
employee_name varchar(150) NO NULL