我是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));
}
任何帮助将不胜感激。
感谢。
答案 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只是一个数组?你在任何地方分配价值吗?这不应该在视图中完成。