[英]Yii2: how to populate a Gridview column using a SQL query?
我有一个 GridView 有两列:Id 和 Lastname。
Id 列效果很好,但 Lastname 列有问题:我需要执行一个简单的 SQL 查询SELECT lastname FROM persons
来完成 Lastname 列。
我不知道该怎么做。 这是我尝试过的:
<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
[
'label' => 'Lastname',
'value' => function() {
$myQuery = 'SELECT lastname FROM persons';
return = Yii::$app->getDb()->createCommand($myQuery)->queryAll(); // Problem here.
}
]
]
)] ?>
我的 PersonsSearch.php model 的 DataProvider(是否可以在此处添加我的 sql 查询?):
public function search($params)
{
$query = Persons::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => [
'defaultOrder' => [
'id' => SORT_ASC
]
],
]);
$this->load($params);
if (!$this->validate()) {
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
]);
$query->andFilterWhere(['ilike', 'id', $this->id]);
return $dataProvider;
}
您在$dataprovider
中有什么? 如果它加载了 people 表中的对象,您可以像id
- lastname
一样调用它,或者您可以这样调用它:
[
'label' => 'Lastname',
'value' => function($model) {
return $model->lastname;
}
]
在 PersonsSearch.php
public function rules()
{
return [
[['id'], 'integer'],
[['lastname'], 'safe'],
];
}
并搜索 function
public function search($params)
{
$query = Persons::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => [
'defaultOrder' => [
'id' => SORT_ASC
]
],
]);
$this->load($params);
if (!$this->validate()) {
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
]);
$query->andFilterWhere(['ilike', 'id', $this->id]);
$query->andFilterWhere(['like', 'lastname', $this->lastname]);
return $dataProvider;
}
其他方式,当你有
[
'label' => 'Lastname',
'value' => function($model) {
return $model->getLastName();
}
]
在Persons.php
model 中创建名为getLastName()
的 function
public function getLastName(){
$myQuery = 'SELECT lastname FROM persons'; //maybe you have where condition "where id = {$this->id}" ?
$result = Yii::$app->getDb()->createCommand($myQuery)->queryOne();
if($result){
return $result['lastname'];
}
}
如果您有很多行,则使用queryAll()
并 foreach 结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.