Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php yii2:一对多关系的索引页(带搜索),禁用所有字段_Php_Mysql_Yii_Yii2 - Fatal编程技术网

Php yii2:一对多关系的索引页(带搜索),禁用所有字段

Php yii2:一对多关系的索引页(带搜索),禁用所有字段,php,mysql,yii,yii2,Php,Mysql,Yii,Yii2,我是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也一样 ? 我对创建/更新/删除操作不感兴趣,只对带有搜索

我是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也一样

?

我对创建/更新/删除操作不感兴趣,只对带有搜索的索引感兴趣

我已经能够使用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,我想显示多个字段

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

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


提前感谢

您需要更改您的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'],
],
然后将它们添加到规则中

public function rules(){
    return [
        ...,
        [[...,'afield1','afield2'],'safe'],
        ...,
   ];
}
然后在搜索函数中,将a连接到b,并告诉数据提供者如何处理排序

$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”方法,将该关系转换为字符串,但其他方式也可以以类似的方式工作

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