ActiveDataProvider,具有指向一个参考表的多个链接

时间:2018-12-31 15:06:41

标签: yii2

在mysql中,我可以创建查询,如下所示: 选择a.field1,b.field2,c.field2 来自表1 a,表2 b,表2 c 其中a.field2 = b.field1 和a.field3 = c.field1;

我需要能够使用ActiveDataProvider通过搜索功能在Yii中表达这一点。

我尝试了以下方法: ...

     $dataProvider->setSort([
         'defaultOrder' => [
             'id' => SORT_ASC,
         ],
        'attributes' => [
            'id',
            'field1' => [
                'asc' => ['table1.field1' => SORT_ASC],
                'desc' => ['table1.field1' => SORT_DESC],
                'label' => 'Event Date'
            ],
            '1Name' => [
                'asc' => ['table2.field2' => SORT_ASC],
                'desc' => ['table2.field2' => SORT_DESC],
                'label' => 'Label 1'
            ],
            '2Name' => [
                'asc' => ['table2.field2' => SORT_ASC],
                'desc' => ['table2.field2' => SORT_DESC],
                'label' => 'Label 2'
            ],

...

这确实会导致显示两列,但是两列中的数据都是相同的,但是如果运行如上所述的实际查询,则两列之间显示的数据会有所不同。

我只能通过将table2中的数据分成两个不同的表来找到解决方案,但这不是理想的解决方案,并且拒绝搜索功能“属性部分”中的差异为:

...

     $dataProvider->setSort([
         'defaultOrder' => [
             'id' => SORT_ASC,
         ],
        'attributes' => [
            'id',
            'field1' => [
                'asc' => ['table1.field1' => SORT_ASC],
                'desc' => ['table1.field1' => SORT_DESC],
                'label' => 'Event Date'
            ],
            '1Name' => [
                'asc' => ['table2.field2' => SORT_ASC],
                'desc' => ['table2.field2' => SORT_DESC],
                'label' => 'Label 1'
            ],
            '2Name' => [
                'asc' => ['table3.field2' => SORT_ASC],
                'desc' => ['table3.field2' => SORT_DESC],
                'label' => 'Label 2'
            ],

...

任何想法,建议将不胜感激。

为了更清楚起见,我们感兴趣的两个表是anamain和麻醉的。

anamain与其他字段一起包含, 麻醉剂 麻醉剂 都定义为INT。

麻醉剂,包含2个字段, id,定义为INT 麻醉药,定义为varchar(50)。 这两个表通过anaesthetic.id字段与anamain.anaesthetic1id和anamain.anaesthetic2id字段之间的一对多关系链接。

直接在数据库中工作,以下sql返回适当的数据:

选择,b。麻醉剂称为“第一麻醉剂”,c。麻醉剂称为“第二麻醉剂” 来自anamain a,麻醉剂b,麻醉剂c 其中a.anaesthetic1 = b.id 和a.anaesthetic2 = c.id;

此sql返回2列,每条记录的所有列都有不同的价位,这是预期的。

我的问题是试图通过ActiveDataProvider在Yii的搜索功能中实现此查询。 我尝试了以下代码:

$dataProvider->setSort([
'defaultOrder' => [
'id' => SORT_ASC,
],
'attributes' => [
'id',
'anaesthetic1Name' => [
'asc' => ['anaesthetic.anaesthetic' => SORT_ASC],
'desc' => ['anaesthetic.anaesthetic' => SORT_DESC],
'label' => ‘First Anaesthetic'
],
‘anaesthetic'2Name' => [
'asc' => ['anaesthetic.anaesthetic' => SORT_ASC],
'desc' => ['anaesthetic.anaesthetic' => SORT_DESC],
'label' => ‘Second Anaesthetic'
],

我将查询定义为:

if (!($this->load($params) && $this->validate())) {
$query->joinWith(['anaesthetic']);
return $dataProvider;
}

这确实通过DetailView :: widget返回2列“ First Anaesthetic”和“ Second Anaesthetic”。但是,所有记录的两列中的数据都相同。

我尝试为麻醉剂表创建模型的版本-分别为anasethetic1.php和anaesthetic2.php,并将搜索功能中的查询调整为

if (!($this->load($params) && $this->validate())) {
$query->joinWith(['anaesthetic1']);
$query->joinWith(['anaesthetic2']);
return $dataProvider;
}

但是,由于两个模型都引用相同的基础表,因此在执行查询时会引发数据库错误。

是否有一种方法可以像在纯数据库sql中一样将别名的使用复制到Tie中。

我希望这可以提供足够的清晰度。

0 个答案:

没有答案