我有一个模型证书,其中包含另一个名为Application的模型的外键application_id。因此,每个证书都属于单个应用程序。
现在有一种情况我希望显示现有用户的所有证书。用户标识存在于应用程序模型中,如user_id。
这是查询
SELECT * FROM `certificates`
inner join applications b ON
application_id = b.id where b.user_id = 7
现在基于来自上述查询的记录,我想显示一些证书列,一些来自使用网格视图的应用程序。但由于某些原因,如果记录多于一个,那么我就不会从应用程序中获取任何列数据。
<?php Pjax::begin(); ?> <?= GridView::widget([
'dataProvider' => $dataProvider,
// 'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'application_id',
'verified_application_file_path',
'certificate_name',
'application.name',
'application.user_id',
[
'attribute' => 'creation_date',
'format' => ['date', 'php:d/m/Y']
],
[
'attribute' => 'expiry_date',
'format' => ['date', 'php:d/m/Y']
],
],
]); ?>
<?php Pjax::end(); ?></div>
如果单个记录返回,则上面的网格显示名称和用户ID,否则显示&#34;未设置&#34;。我不知道为什么&#39; application.name&#39;当收到多条记录时,&application.user_id&#39;不起作用。
这是我使用yii2的查询
/**
* Creates data provider instance with search query applied
*
* @param array $params
*
* @return ActiveDataProvider
*/
public function search_vendor_certificates($user_id)
{
$query = ApplicationCertificates::find()->joinWith('application b',true , 'INNER JOIN')->where(["b.user_id"=>$user_id]);
// add conditions that should always apply here
$dataProvider = new \yii\data\ActiveDataProvider([
'query' => $query,
]);
return $dataProvider; }
如果有人告诉我在显示应用程序模型的正确属性时所犯的错误,我将不胜感激。
答案 0 :(得分:0)
首先(不要使用它,我会告诉你一个逻辑错误):
->joinWith('application b',true , 'INNER JOIN')
U为application
b
设置别名,然后在GridView
中使用application
。无论如何,如果你在b
中将其重命名为GridView
,那仍然很糟糕。
基于this回答:
Model TableTwo:
public function getTableOneRecord()
{
return $this->hasOne(TableOne::className(), ['id' => 't1_id']);
}
public function getTableThreeRecord()
{
return $this->hasOne(TableThree::className(), ['id' => 't3_id']);
}
public function getTableFourRecord()
{
return $this->hasOne(TableFour::className(), ['id' => 't4_id'])
->via('tableThreeRecord');
}
视图文件:
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
't1_id',
'tableOneRecord.id',
't3_id',
'tableThreeRecord.id',
'tableThreeRecord.t4_id',
'tableFourRecord.id',
],
]);
最简单的说法是,你的搜索关系在GridView中不起作用,你必须在Model
中定义关系,然后使用它们;)