gpt4 book ai didi

activerecord - 如何在 Yii 中使用 dataprovider 获取连接表的所有列?

转载 作者:行者123 更新时间:2023-12-03 07:46:54 26 4
gpt4 key购买 nike

我的 Controller

$criteria = new CDbCriteria();
$criteria -> select = 't.*,b.*';
$criteria -> join = 'INNER JOIN tbl_b b on b.b_id = t.id ';
$criteria -> join .= 'INNER JOIN tbl_c c on c.id = b.c_id';
$criteria -> condition = 'c.id = :cid';
$criteria -> params = array(':cid' => 1);
$dataProvider = new CActiveDataProvider('tbl_a',array(
'criteria' => $criteria
));
$this->render('view',array('dataProvider' => $dataProvider));

我的观点

$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'my-grid',
'dataProvider' => $dataProvider,
'columns' => array(
'name',
'description',
array(
'header' => 'Column from tbl_b',
'value' => ''
),
array(
'class'=>'CButtonColumn',
'template' => '{view}'
), ),));

我的问题是:如何显示 tbl_b 中的列值。由于在 dataprovider 中,我指定了 tbl_a,它仅从 tbl_a 提取数据,而不是从 tbl_b 提取数据,尽管我还选择了 tbl_b 中的所有记录。

据我所知,它应该显示为 $data -> tbl_b -> col_b。但这会产生错误,因为未定义 tbl_a.tbl_b 。 我想知道问题出在哪里?

与关系有关吗? tbl_atbl_c 通过 tbl_b<MANY_MANY 相关。即 tbl_b 有两列链接 tbl_atbl_c 的主 ID。

注意:名称和描述来自 tbl_a 并且会显示。

请推荐!

最佳答案

我通常做的就是在 ActiveRecord 中创建一个属性。

class A extends CActiveRecord {

public $bAttribute1

}

当我将表 A 与表 B 连接时,我将要使用我创建的属性显示的 B 字段重命名为(在本例中,为 bAttribute)

$dataProvider = new CActiveDataProvider('A', array(
'criteria' => array(
'select' => array('t.*', 'b.attribute1 AS bAttribute1'),
'join' => 'JOIN B AS b ON b.joinId = t.id',
)
));

然后我可以在 GridView 中显示 bAttribute1

$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider' => $dataProvider,
'columns' => array(
'bAttribute1',
)));

这应该可以工作。但缺点是,如果您想显示连接表中的大量列,则必须创建大量属性。

更新

奇怪,所以我尝试从头开始制作示例。我创建了两个表 ModelAModelB 如下所示。

CREATE TABLE IF NOT EXISTS `ModelA` (
`id` int(11) NOT NULL,
`attribute2` int(11) NOT NULL,
`attribute3` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `ModelB` (
`id` int(11) NOT NULL,
`aId` int(11) NOT NULL,
`attribute3` int(11) NOT NULL,
`attribute4` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

如您所见,ModelB 中的aIdModelA 的外键。然后我举了一些例子。

INSERT INTO `ModelA` (`id`, `attribute2`, `attribute3`) VALUES
(1, 1, 1),
(2, 2, 2);
INSERT INTO `ModelB` (`id`, `aId`, `attribute3`, `attribute4`) VALUES
(1, 1, 10, 100),
(2, 2, 20, 200),
(3, 1, 30, 300),
(4, 1, 40, 400);

因此,ModelA 中的条目 #1 将被 ModelB 中的 3 个条目引用,而条目 #2 将只有 1 个条目。

然后我创建了模型代码。

class ModelA extends CActiveRecord {
public $bAttribute3;
public $bAttribute4;
public static function model($className = __CLASS__) {
return parent::model($className);
}
}

查看模型中的bAttribute3bAttribute4,我把attribute3attribute4来自 ModelB表分别存在。然后在 Controller 中我创建了 DataProvider

public function actionIndex(){
$dataProvider = new CActiveDataProvider('ModelA', array(
'criteria' => array(
'select' => array(
'`t`.*',
'`b`.`attribute3` AS `bAttribute3`',
'`b`.`attribute4` AS `bAttribute4`'
),
'join' => 'JOIN `ModelB` AS `b` ON `b`.`aId` = `t`.`id`',
)
));
$this->render('index', array(
'dataProvider' => $dataProvider,
));
}

在 View 中,我做了这个

$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'my-grid',
'dataProvider' => $dataProvider,
'columns' => array(
'id',
'attribute2',
'attribute3',
'bAttribute3',
'bAttribute4',
),
));

所以,这就是我所看到的

Imgur

这是你想要的吗?即使对于 CActiveDataProvider,我也通常这样做。我认为您可能会错过代码中的某些内容。

关于activerecord - 如何在 Yii 中使用 dataprovider 获取连接表的所有列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11143975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com