如何从不同的表中检索数据并将其保存在Yii中的数组中

时间:2013-12-09 11:51:03

标签: php yii

我是yii框架的新手。我在yii框架中有三个不同的表。

第一张表

第一个表是language(id,language_name)// id是主键。

第二张表

第二个表是经文(id,topic_id,verse_text)// id是主键,topic_id是外键。

第三表

第三个表是verse_translations(id,verse_id,language_id,translations_text) // id是主键,language_id是带有语言表的外键引用,// verse_id是带有verse表的外键引用。

现在我的问题是。

我如何编写查询或使用关系等获取结果,如下面给出的表格。

verse_id | topic_id |    verse    |    verse_translation  |  language |

  1           1        verse here      translation here      English
                                       translation here      Spanish
                                       translation here      Japanese
                                       translation here      Italia

我的控制器方法

public function actionVerse()
    {
    $topic_id = 1;  

  $result = Yii::app()->db->createCommand()->setFetchMode(PDO::FETCH_OBJ)
    ->select('v.id, v.verse_text, vt.translation_text, l.language_name as lname)
    ->from('verse v')
    ->join('verse_translations vt' , 'v.id = vt.verse_id')
        ->join('language l' , 'l.id = vt.language_id')
        ->where('t.id = :var' , array(':var'=>$topic_id))
        ->queryAll();

    $dataProvider=new CArrayDataProvider($result, array(
    'id'=>'Verse',
    'sort'=>array(
        'attributes'=>array(
             'id','verse_text','translation_text','lname'
        ),
    ),
    'pagination'=>array(
        'pageSize'=>10,
    ),));
        $this->render('myverse',array('dataProvider'=>$dataProvider));
    }

任何帮助将不胜感激。

感谢。

4 个答案:

答案 0 :(得分:1)

对于你想要的你可能会更好地使用关系。请参阅Yii有关如何使用它们的文章http://www.yiiframework.com/doc/guide/1.1/en/database.arr

这应该可以为您提供所需的一切。

答案 1 :(得分:1)

获取数组是预期的行为。您可以告诉Yii告诉PDO改为获取objectc:

$result = Yii::app()->db->createCommand()->setFetchMode(PDO::FETCH_OBJ)
    ->select('v.id, v.verse_text, vt.translation_text, l.language_name as lname)
    ->from('verse v')
    ->join('verse_translations vt' , 'v.id = vt.verse_id')
        ->join('language l' , 'l.id = vt.language_id')
        ->where('t.id = :var' , array(':var'=>$topic_id))
        ->queryAll();

   foreach ($result as $row) {
       echo $row->id;
       echo $row->verse_text;
       echo $row->translation_text;

   }

答案 2 :(得分:0)

试试这个

$count=Yii::app()->db->createCommand('SELECT COUNT(*) FROM tbl_user')->queryScalar();

$sql='SELECT * FROM tbl_user';

$dataProvider=new CSqlDataProvider($sql, array(
    'totalItemCount'=>$count,
    'sort'=>array(
        'attributes'=>array(
             'id', 'username', 'email',
        ),
    ),
    'pagination'=>array(
        'pageSize'=>10,
    ),
));
// $dataProvider->getData() will return a list of arrays.

然后您可以将$ dataProvider传递给CGridView

有关将自定义查询用作dataProvider的更多文档,请检查here.

答案 3 :(得分:0)

如果你想以这种方式工作,那么使用关系会好得多。

如果你调用queryAll()或类似函数,你将总是得到一个数组。

如果需要在DataProvider中使用这些关系,则应使用ActiveRecords的with()函数,例如:

/**Controller **/
$model = new Translation('search');

/** Translation model **/
public function search(){
  ...
  $criteria->with = array('verse', 'language');
  ...
}

无论哪种方式,你为什么要用 - >来调用它?和nos只是一个数组?你在任何地方分配价值吗?这不应该在视图中完成。