【问题标题】:yii2: index page (with search) for relation one-to-many disaplying all fieldsyii2:索引页面(带搜索)关系一对多显示所有字段
【发布时间】:2015-08-19 20:24:55
【问题描述】:

我是 Yii 的新手,我想知道这个问题是否可以在 yii 框架中解决。 我有三个表(A,B,C),A有主键'a_id',B和C有一个链接到A(例如:b_a_id,c_a_id),它是'a_id'的外键,关系A-B是一对一,关系 A-C 是一对多。

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

1) 对于关系 A - B,一个索引页面,每个字段都有搜索栏,显示 A 和 B 的所有字段

2) 对于关系 A - C,每个字段都有搜索栏的索引页,显示 A 和 c 的所有字段

3) A - B - C 相同

??

我对 CREATE/UPDATE/DELETE 操作不感兴趣,只对带有 SEARCH 的 INDEX 感兴趣

我已经能够使用 B 控制器/模型/视图来显示 A-B 关系,显示带有 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.a_field2”上的搜索框不可用,“b_a_id.d_id.field1”上的搜索框也不明显。我知道为什么。因为使用外国 kwy 我想显示多个字段。

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

请准确回答,因为我是 Yii 新手

提前致谢

【问题讨论】:

    标签: php mysql yii yii2


    【解决方案1】:

    您将需要更改您的 searchModel(当您创建 crud 时由 GII 生成的那个)。

    在你看来先换成,

    <?= 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如何处理排序

    $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'方法来转换这种关系转换成一个字符串,但在其他方面以类似的方式工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      相关资源
      最近更新 更多