我有一个要求,我想显示一个记录列表,每条记录的信息可以来自一组表。为了进一步解释,我有以下表格:
表srp,列id(PK),srpname,idbusiness(FK),idsite(FK)
包含列ID(PK),businessname
的表业务包含列ID(PK),网站名称
的表网站表srpprimary与列id(PK),idsrp(FK),pname
表srpdepname,列id(PK),idsrp(FK),dname
srp可以在表srpprimary中有多个条目,并且每个其他表中的一个条目business,site,srpdepname
我想要的是显示srp记录以及表srpprimary中的所有pname条目,表srpdepname中的dname以及实际的业务名称和站点名称。
我查看了CListView,但看不出我是如何获得这些额外数据的。
非常感谢有关如何最好地实现上述目标的任何建议。
亲切的问候
e25taki
答案 0 :(得分:3)
为了帮助您解决这个问题,我建议您在下一个项目中使用数据库关系:
1- prraper your datbase
2-在表格上写下你的关系
3-做它(例如使用phpmyadmin):
How to create a relation between two tables using PHPMyAdmin?
https://www.youtube.com/watch?v=IdQGFZwP7Xc
Sql方法
ALTER TABLE订单 添加约束fk_PerOrders 外键(P_Id) 参考人员(P_Id)
4-现在您可以使用yii gii创建代码,所有关系将保存在模型类中
5-视图中的加载数据现在非常简单:
例如,如果您的模型如下:
<?php
..
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'co' => array(self::BELONGS_TO, 'Country', 'co_id'),
'events' => array(self::HAS_MANY, 'Events', 'city'),
'news' => array(self::HAS_MANY, 'News', 'city'), /// here
'users' => array(self::HAS_MANY, 'Users', 'city'),
);
}
...
?>
因此,我们可以通过以下方式访问与当前城市相关的所有新闻表:
echo $model->news->title;
答案 1 :(得分:1)
如果关系正确,您可以访问以下数据:
$srp = Srp::model()->findByPk(1);
$sites = $srp->sites; // gets an active record-array with a HAS_MANY-relation
$site = $srp->site; // gets the active record directly with a HAS_ONE-relation
考虑到Gii中的代码生成,如果你重命名你的外键,你将会有一个更容易的时间,所以他们以&#34; id&#34;或&#34; _id&#34;。这样,在生成模型时,您将自动获得sensiblle关系。 (虽然他们可能仍需要调整一下以满足您的需求。)
通过您的新关系,您可以在视图中创建这样的列表视图:
$dataProvider=new CActiveDataProvider('Srp');
$this->widget('zii.widgets.CListView', array(
'dataProvider' => $dataProvider,
'itemView' => '_view',
));
并访问您的数据(_view.php):
<b>Id:</b> // Or better yet: echo CHtml::encode($data->getAttributeLabel('id'));
<?php echo $data->id; ?>
<br />
<b>Business:</b>
<?php echo $data->business->name; ?>
<br />
<b>Site:</b>
<?php echo $data->site->name; ?>
<br />
<b>Depname:</b>
<?php foreach ($data->srpdepnames as $dep): ?>
<?php echo $dep->dname; ?>,
<?php endforeach ?>
<br />
<b>Depname:</b>
<b><?php echo CHtml::encode($data->getAttributeLabel('srpprimary_id')); ?>:</b>
<?php foreach ($data->srpprimaries as $prime ){
echo CHtml::link( // If you want links instead of just text.
CHtml::encode($prime->pname),
array('SrpPrimary/View', 'id'=>$prime->id)
);
}?>
(我还没试过这个,所以它不是一个有效的例子。抱歉!但是它应该给你一个想法,它离真相不远。)
答案 2 :(得分:0)
In controller.php
public function actionQueries()
{
$dataProvider=new CActiveDataProvider('Student', array(
'criteria' => array(
'with' =>'student',
'join' => 'INNER JOIN studentinfo si ON si.stud_id=t.id',
)
));
$this->render('query',array(
'dataProvider'=> $dataProvider,
));
}
in a view,in tables model view make php file for ex query.php
<?php
/* @var $this StudentController */
/* @var $model Student */
$this->breadcrumbs=array(
'Students'=>array('query'),
//$user->name,
);
$this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_view', // refers to the partial view named '_post'
'enablePagination'=>true,
'sortableAttributes'=>array(
'name',
)
));
?>
// add your new feilds in _view.php file:
// in controller.php
in accsessRule() add your new file for authentication for ex.queris
public function accessRules()
{
return array(
array('allow', // allow all users to perform 'index' and 'view' actions
'actions'=>array('index','view','queries'),
'users'=>array('*'),
),
}