显示视图中不同表的数据

时间:2013-06-04 02:15:07

标签: yii

我有一个要求,我想显示一个记录列表,每条记录的信息可以来自一组表。为了进一步解释,我有以下表格:

表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

3 个答案:

答案 0 :(得分:3)

为了帮助您解决这个问题,我建议您在下一个项目中使用数据库关系:

1- prraper your datbase

2-在表格上写下你的关系

3-做它(例如使用phpmyadmin):

  • by GUI methode

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('*'),
            ),
}