2015-07-01 24 views
0

我在Yii中很新,我想知道这个问题是否可以在yii框架中解决。 我有三个表(A,B,C),A有主键'a_id',B和C有一个链接到A(例如:b_a_id,c_a_id),它是'a_id'的外键,关系AB是一对一的,关系AC是一对多的。yii2:索引页面(与搜索)关系一对多全部关联

是否有可能在Yii中以简单的方式有:

1)关于A - B,显示A的所有领域的索引页面的各个领域搜索栏和B

2),用于相对于A - C,具有用于显示A的所有领域的各个领域和c

3)相同的用于搜索栏的索引页 - B - Visual C

??

我没有兴趣在创建/更新/删除操作,只能用搜索索引

我已经能够展示采用B控制器/ AB型关系/查看显示的索引页以A场和B的各场。 我用这样的代码下面

<?= GridView::widget([ 
    'dataProvider' => $dataProviderB, 
    'filterModel' => $searchModelB, 
    'columns' => [ 
     //['class' => 'yii\grid\SerialColumn'], 
     'b_id', 
     'b_field1', 
     'b_field2', 

     'b_a_id.a_field1', //field of B table 
     'b_a_id.a_field2', 
     'b_a_id.d_id.field1', //also field of D table liked to B 

     ['class' => 'yii\grid\ActionColumn'], 
    ], 
]); ?> 

,但它不是对“b_a_id.a_field1”可用的搜索框,在“b_a_id.d_id.field1” b_a_id.a_field2“既不明显。我知道为什么。因为使用国外kwy,我想显示多个字段。

对这类问题你有什么建议吗? 我应该建立一个连接sql命令并显示它吗?搜索可用吗? 我应该在mysql数据库中建立一个视图并从视图中生成模型吗?

请准确回复,因为我在Yii的是新提前

回答

1

你需要改变你的searchModel(一个由GII产生的,当你所做的CRUD)

感谢。

在你看来第一个变化成

<?= GridView::widget([ 
'dataProvider' => $dataProviderB, 
'filterModel' => $searchModelB, 
'columns' => [ 
    //['class' => 'yii\grid\SerialColumn'], 
    'b_id', 
    'b_field1', 
    'b_field2', 

    ['attribute'=>'afield1','value'=>'b_a_id.a_field1'], //so you have an easy tag to refer to in the searchmodel 
    ['attribute'=>'afield2','value'=>'b_a_id.a_field2'], 
    //left out the one to D, should be analog 

    ['class' => 'yii\grid\ActionColumn'], 
], 

现在您的searchModel你需要做的几个步骤,首先关闭所有的类中添加

public $afield1 //the tag we used in the grid 
public $afield2 

然后在将它们添加规则

public function rules(){ 
    return [ 
     ..., 
     [[...,'afield1','afield2'],'safe'], 
     ..., 
    ]; 
} 

然后在搜索函数中,加入a到b,并告诉dataProvider h andle排序

$query = b:find(); 

$query->joinWith('b_a_id');//join the table 

$dataProvider = ...; 

$this->load($params); 

$dataProvider->sort->attributes['afield1'] = [ 
    'asc'=>['b_a_id.a_field1'], 
    'desc'=>['b_a_id.a_field1'] 
] // tell how to sort 

最后,其中查询是添加一个“andFilterWhere”这样

$query->andFilterWhere([...]) 
    ... 
    ->andFilterWhere(['like','b_a_id.a_field1']); 

它也可以进行排序一个一对多/多对许多关系,一个类似的方法,除了需要更多的连接外,还需要在模型中定义一个'getOneToManyDisplay'方法,将该关系转换为一个字符串,但其他方式以类似的方式工作