2013-12-09 2 views
0

저는 yii 프레임 워크에서 새로운 기능입니다. 나는 yii 프레임 워크에 3 개의 다른 테이블을 가지고있다.다른 테이블에서 데이터를 가져와 Yii 배열로 유지하는 방법

먼저 표

첫 번째 테이블은 언어 (ID, LANGUAGE_NAME) // ID가 기본 키입니다.

번째 테이블

번째 테이블이 절 (ID, topic_id, verse_text) // ID는 외국 topic_id 키 기본 키이다.

세 번째 표

세 번째 표는 verse_translations입니다 (아이디, verse_id, LANGUAGE_ID, translations_text) // ID, LANGUAGE_ID가 // verse_id와 외래 키 참조하고, 언어 테이블과 외래 키 참조 기본 키입니다 운문 테이블.

내 질문이 있습니다.

어떻게 아래의 주어진 테이블과 같은 결과를 가져 오는 쿼리를 작성하거나 관계 등을 사용합니다.

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

는 어떤 도움을 이해할 수있을 것이다.

감사합니다.

답변

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; 

    } 
0

당신은 아마하고자 원하는 것을 들어 here.

+3

우리가 귀하의 질문에 도움을 줄 수있는 포럼입니다. 모든 경로와 테스트는 우리가하지 않아야합니다. 위 스크립트에서 쿼리를 구현하면 원하는 결과를 얻을 수 있습니다. –

1

을 확인, 당신의 dataProvider로 지정 쿼리를 사용하여 당신의 CGridView에

또한 문서를을 $의 dataProvider를 전달할 수 있습니다 그런 다음이 하나

$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. 

시도 관계를 더 잘 사용하십시오. 그들이 http://www.yiiframework.com/doc/guide/1.1/en/database.arr

이 정확하게 당신이 필요를 제공해야합니다 사용하는 방법에 대한 YII 문서를 참조하십시오.

0

그런 식으로 작업하고 싶다면 관계를 사용하는 것이 좋습니다.

queryAll() 또는 이와 유사한 함수를 호출하면 항상 배열이 생성됩니다.

당신은 예를 들어, 당신은 ActiveRecords fo를() 함수와 함께 사용해야합니다 당신의 dataProvider 내의 그 관계를 가지고해야하는 경우 :

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

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

어느 쪽이든, 왜 당신이 그것을 호출하려고 -> 및 배열이 아닙니다. 어디에서나 값을 할당하고 있습니까?이것은 뷰에서 수행되면 안됩니다.

관련 문제