0

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

具有列 id (PK)、srpname、idbusiness (FK)、idsite (FK) 的表 srp

具有列 id (PK)、businessname 的表业务

具有列 id (PK)、站点名称的表站点

具有列 id (PK)、idsrp (FK)、pname 的表 srpprimary

表 srpdepname 与列 id (PK)、idsrp (FK)、dname

一个 srp 可以在表 srpprimary 中有多个条目,而在其他表 business、site、srpdepname 中的每个条目都有一个条目

我想要显示一条 srp 记录以及表 srpprimary 中的所有 pname 条目、表 srpdepname 中的 dname 以及实际的企业名称和站点名称。

我查看了 CListView,但看不到如何获取这些附加数据。

任何关于如何最好地实现上述目标的建议将不胜感激。

亲切的问候

e25taki

4

3 回答 3

3

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

1- 完善您的数据库

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

3- 这样做(例如使用 phpmyadmin ):

  • 通过 GUI 方法

如何使用 PHPMyAdmin 在两个表之间创建关系?

https://www.youtube.com/watch?v=IdQGFZwP7Xc

  • sql方法

    ALTER TABLE Orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id) REFERENCES Persons(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; 
于 2013-06-04T06:05:12.390 回答
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 中的代码生成,如果您将外键重命名为以“id”或“_id”结尾,您将会轻松得多。这样,当您生成模型时,您将自动获得合理的关系。(尽管它们可能仍需要稍作调整以满足您的需求。)

使用您的新关系,您可以在视图中创建这样的列表视图:

$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)
   );
}?>

(我没有尝试过,所以这不是一个有效的例子。对不起!但它应该给你一个想法,并且离事实不远。)

于 2013-06-04T04:36:05.340 回答
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('*'),
            ),
}
于 2013-12-19T12:23:55.963 回答