【问题标题】:yii2 how to get relations and get title of id using foreign keyyii2如何使用外键获取关系并获取id的标题
【发布时间】:2015-03-11 11:13:11
【问题描述】:

我有事件模型,一个事件有一个项目,一对一关联,我在事件模型中编写函数来获取项目如下

 public function getprojects() {
    return $this->hasOne(app\models\Project::className(), ['id' => 'projectid']);
}

下面是我的控制器的代码

if ($model->load(Yii::$app->request->post()) && $model->save()) {
            $project = $model->project;
            return $this->redirect(['eventdetail', 'id' => $model->id, 'project' => $project]);
        }

详细视图代码是

 <?= DetailView::widget([
        'model' => $model,
        'attributes' => [
            'id',
            'projectid',
            'userid',
            'milestone',
            'datetime',
        ],
    ]) ?>

我想打印项目的标题而不是 projectid ,我们从关联表中获取标题我如何获取标题并在详细视图中打印

【问题讨论】:

    标签: activerecord yii


    【解决方案1】:

    1) 如果您只需要文本值,最简单的方法是将projectId 更改为projects.title

    'attributes' => [
        'projects.title',
    ],
    

    同样根据标签取自Projects模型。

    2)对于更复杂的情况和不同的格式,您可以调用任何模型方法来检索所需的数据。

    例子:

    'attributes' => [
        [        
            'attribute' => 'avatar',
            'format' => 'raw',
            'value' => $model->getAvatar(),
        ],
    ],
    

    【讨论】:

    • = DetailView::widget([ 'model' => $model, 'attributes' => [ 'id', 'projects.title', 'userid', 'milestone', ' datetime', ], ]) ?> 带有错误消息 Class 'app\models\app\models\Project' not found
    • getProjects() 关系中尝试像这样添加前导斜杠:\app\models\Project::className() 或在使用部分声明它,如下所示:使用app\models\Project::className(),然后将关系更改为Project::className()
    • 将模型转换为 public function getproject() { return $this->hasOne(Project::className(), ['id' => 'projectid']); } 并且它现在正在工作:)
    【解决方案2】:

    要在 DetaileView 中获取关系数据,您可以使用magic methods

    <?= DetailView::widget([
            'model' => $model,
            'attributes' => [
                'id',
                 array(
                    'attribute' => 'projectid',
                    'value' => $model->project->title,
                )
                'userid',
                'milestone',
                'datetime',
            ],
        ]) ?>
    

    并将模型中的关系代码更改为:

    首先,页面在namespace之后开始添加

    use app\models\Project;
    

    其次,如果你有一对一的关系,调用camelcase中的函数getProjectgetProjects是一对多的关系。

     public function getProject() {
        return $this->hasOne(Project::className(), ['id' => 'projectid']);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      相关资源
      最近更新 更多