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


How to retrieve data from different tables and keep it in array in Yii

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

第一张表

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

第二表

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

第三张表

第三个表是verse_translations(id,verse_id,language_id,translations_text)//id是主键,language_id是带有language表的外键引用,//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));
    }

任何帮助都将不胜感激。

谢谢。

获取数组是预期的行为。你可以告诉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;
   }

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

这应该能为你提供你所需要的东西。

试试这个

$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的更多文档,请查看此处。

如果您想以这种方式工作,最好使用关系。

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

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

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

不管怎样,你为什么要用->和nos来调用它,只是一个数组?你在任何地方赋值吗?这不应该在视图中进行。