【发布时间】:2015-05-26 13:35:06
【问题描述】:
我的部分架构如图所示:
联结表映射哪些项目属于哪个类别,“特色”列将项目标记为该类别中的特色。
我需要做的是获取特定类别中所有项目的列表,包括联结表中的“特色”属性,并将该数据传递到网格视图中进行显示。
我为category_item 表创建了一个模型,并尝试实施here 提出的解决方案,但我如何访问数据并将其传递到gridview 中?
类别模型
public function getCategoryItems()
{
return $this->hasMany(CategoryItem::className(), ['category_id' => 'id']);
}
public function getItems()
{
return $this->hasMany(Item::className(), ['id' => 'item_id'])->viaTable('{{%category_item}}', ['category_id' => 'id']);
}
类别搜索模型
public function search($params)
{
$query = Category::find()->with('items')->with('categoryItems');
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$this->load($params);
if (!$this->validate()) {
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
'type' => $this->type,
]);
$query->andFilterWhere(['like', 'title', $this->title])
->andFilterWhere(['like', 'description', $this->description]);
return $dataProvider;
}
物品模型
public function getItemCategories()
{
return $this->hasMany(CategoryItem::className(), ['item_id' => 'id']);
}
public function getCategories()
{
return $this->hasMany(Category::className(), ['id' => 'category_id'])->viaTable('{{%category_item}}', ['item_id' => 'id']);
}
控制器
public function actionCategory($id = null)
{
if($id == null) {
$dataProvider = new ActiveDataProvider([
'query' => Category::find()->all(),
]);
return $this->render('category', [
'dataProvider' => $dataProvider,
]);
} else {
$category = Category::findOne($id);
if($category) {
$searchModel = new CategorySearch();
$itemsDataProvider = new ActiveDataProvider([
'query' => $searchModel->search(['CategorySearch'=>['id'=>$id]]),
]);
return $this->render('editCategory', [
'itemsDataProvider' => $itemsDataProvider
'model' => $category,
]);
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}
}
查看
<div class="row">
<div class="col-md-12">
<h2>Items</h2>
<?= GridView::widget([
'dataProvider' => $itemsDataProvider,
'columns' => [
'id',
'name',
'categoryItems.id',
[
'attribute' => 'items.description',
'format' => 'html',
'value' => 'description',
],
[
'label'=>'Highlights',
'format'=>'raw',
'value'=>function($data) use ($model) {
if(TagFeaturedItem::find()->where(['item_id'=>$data->id, 'tag_id'=>$model->id])->all()) {
return Html::a('Remove as Highlighted', ['/highlights/category/'.$model->id.'/remove/'.$data->id], ['class'=>'btn btn-xs btn-danger']);
} else {
return Html::a('Add as Highlighted',['/highlights/category/'.$model->id.'/add/'.$data->id], ['class'=>'btn btn-xs btn-primary']);
}
},
],
],
]); ?>
</div>
</div>
通常,视图文件是试图找到解决方案的混合搭配。 TagFeaturedItem 模型来自以前版本的视图,请参阅here
【问题讨论】:
-
能否也给我们看一下视图文件?
-
谢谢。整个事情不会导致错误?您只想访问功能标志?我看到另一个类 TagFeaturedItem...
-
是的,我可以通过
$category->items关系获取类别项目,但featured列当然不见了。 -
啊,对不起,对我来说太难了...想知道为什么
'categoryItems.id' 和'items.description'有效。为什么new ActiveDataProvider(['query' => $searchModel->search(['CategorySearch'=>['id'=>$id]]),]);有效。查询不应该是 QueryInterface 实现吗? -
我想从头开始写这篇文章,因为我自己一直在努力关注互联网上流传的所有文章和建议。这类问题的文档很少/不存在,所以现在我正在寻找一个解决方案,我可以丢弃迄今为止编写的任何代码并实现一些可行的东西。
标签: activerecord yii2