我是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来调用它,只是一个数组?你在任何地方赋值吗?这不应该在视图中进行。