【问题标题】:yii2 show data from related tableyii2 显示相关表中的数据
【发布时间】:2020-08-19 21:34:38
【问题描述】:

我有两张桌子:

  • options:带有字段“id(serial), name(varchar), type(int)”。
  • options_activity:与选项表中相同的字段:idnametype 和: activity_id(serial), admin(int), date(timestamp), action(int )

当我创建一个选项时,我将它保存在选项表和 options_activity 中。 options_activity 表是一个寄存器;每次管理员创建/编辑选项时,选项的值都会在选项表中注册并在 options_activity 中复制($model->attributes)并添加日期、管理员 ID 和操作字段(1=已创建,2=已编辑)。没问题。

所以我要做的是,在选项视图中,显示选项视图,然后在下面显示一个包含所有活动的表格(如果有活动)。我怎么能这样做?

示例(视图):

|选项:1 | '这是我的选择' |类型:1

活动表(选项 1):

|---------------------------------------------- ---------------|

|日期:2020-01-01 |管理员:1 |创建 | '这是我的选择 |

|日期:2020-01-03 |管理员:1 |已编辑 | '这是一个选项 |

|日期:2020-02-10 |管理员:2 |已编辑 | '这是选项 |

|---------------------------------------------- ---------------|

我可以显示每个活动,但只想显示该特定选项的活动。我无法按它的 ID 过滤。

这是我的OptionsController,actionView($id):

public function actionView($id)
{
  $searchModel_act = new OptionsActivitySearch();
  $dataProvider_act = $searchModel_act->search(Yii::$app->request->queryParams);
  $model_activity_op = new OptionsActivity();

  return $this->render('view', [
        'searchModel_act' => $searchModel_act,
        'dataProvider_act' => $dataProvider_act,
        'model_activity_op' => $model_activity_op,
        'model' => $this->findModel($id),
    ]);
}

(还尝试了其他选项来尝试传递 id,例如 $dataProvider_act = OpcionesActivity::find()->where(['id' => $id])->orderBy(['fecha' => SORT_ASC])->all();。或者 ['id' => $model->id] 但不起作用。

我的观点

<?=GridView::widget([
    'dataProvider' => $dataProvider_act,
    'filterModel' => $searchModel_act,
    'columns' => [
      ['class' => 'yii\grid\SerialColumn'],
        'id',
        'opcion',
        'type',
        'date',
        'admin',
        'action',
    ],
]) 
?>

在我的模型中,我也尝试了这个,以访问活动但不工作:

public function getActivity()
{
    return $this->hasMany(OptionsActivity::class, ['id' => 'id']);
}

有什么想法吗?

提前致谢!

【问题讨论】:

  • activity.columnName 或 $model->activity->columnName
  • 我试过了,但是不行:$model = new Options(); $dataProvider_act = OptionsActivity::find()->where(['id' => $model->activity->id])->orderBy(['date' => SORT_DESC])->all();我收到此错误:尝试获取非对象的属性“id”
  • 在 GridView 中你可以像属性一样使用 'activity.columnName'

标签: filter datatable yii2 filtering


【解决方案1】:

嗯,它比我想象的要简单得多。

在控制器中:

public function actionView($id)
{

  $searchModel = new OptionsActivitySearch();
  $dataProvider = $searchModel->search(Yii::$app->request->queryParams, $id);

  //---------------------------
  return $this->render('view', [
      'model' => $this->findModel($id),
      'searchModel' => $searchModel,
      'dataProvider' => $dataProvider,
  ]);
}

在 OptionsActivitySearch 中:

    public function search($params, $id)
    {
        $query = OptionsActivity::find()->where(['id' => $id])->orderBy(['id' => SORT_DESC]);

        // add conditions that should always apply here

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

//......
}

在视图中:

...

(gridView 部分):

    <?=         
        GridView::widget([
            'dataProvider' => $dataProvider,
            'filterModel' => $searchModel,
//...
        ])
        ?>

【讨论】:

    猜你喜欢
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2017-12-01
    相关资源
    最近更新 更多