2013-03-05 2 views
1

소셜 엔진 4 용 모듈 내에있는 위젯을 개발하는 동안 쿼리에서 "조인"을 사용하려고합니다. Dreamweaver에서 작업하고 있습니다. 나는이 작업 코드를 대체하는 것을 시도하고있다 :젠드 사회 엔진 4 위젯에서 참여하기

//creates query to get user's region     
$select = $db->select(); 
$select->from("engine4_user_fields_search"); 
$select->where("item_id = ?", $user_id['user_id']); 
$stmt = $db->query($select); 
$result = $stmt->fetchAll(); 

그때 긴 경우 - 다른 체인을 사용해야합니다, 추가하고 결과를 얻기 위해 "매직 넘버"를 사용하여 인덱스에서 빼서.

가입을 사용하면 모든 작업을 수행 할 필요가 없습니다. 간단한 쿼리를 사용하여 결과를 표시 할 수 있습니다. 내가 일하고있는 위젯은 탭 컨테이너에 있으므로 문제가 발생할 때마다 (내가 조인을 사용할 때마다) 전체 탭이 사라지고 문제가 디버깅됩니다.

<?php 

class Widget_RegionalBreakingNewsController extends Engine_Content_Widget_Abstract 
{ 

    public function indexAction() 
    { 
     //connect to DB 
     $file = APPLICATION_PATH . '/application/settings/database.php'; 
     $options = include $file; 
     $db = Zend_Db::factory($options['adapter'], $options['params']); 
     $select = new Zend_Db_Select($db); 
     $db->getConnection(); 
     //end DB setup 


     $user_id = Engine_Api::_()->user()->getViewer(); 


     //SELECT * FROM engine4_user_fields_search as s 
     //join engine4_user_fields_options as o 
     //WHERE item_id = <current user's ID> AND s.field_7+22 = o.option_id 


     $select = $db->select(); 
     $select->from(array('s' => 'engine4_user_fields_search'), 
         array('s.field_7', 's.user_id')) 
       ->joinInner(array('o' => 'engine4_user_fields_options'), 
         's.field_7+22 = o.option_id'); 
     $select->where("s.item_id = ?", $user_id['user_id']); 
     $stmt = $db->query($select); 
     $result = $stmt->fetchAll(); 
     //print_r($result); 

이 젠드와 개발 첫 주이기 때문에, 심지어 오류의 간단한 해고하지 않습니다 여기에

내가 가진 것입니다. 나는 차이를 만들 수있는 간단한 규칙을 모르는 경향이 있습니다. 누구든지 도움을 제공 할 수 있다면 감사하겠습니다.

추 신 : Zend Zend select 함수를 사용하지 않고 정규 SQL 문을 수행 할 수 있습니까?

$select->from(array('s' => 'engine4_user_fields_search'), 
       array('s.field_7', 's.user_id')) 

당신은 두 개의 열을 선택로 이야기하고 내가 무엇을 생각하지 않는 (SELECT s.field_7, s.user_id FROM ...에 해당) :

+0

세 테이블에 참여하고있는 예이다. 그러나 문제는 있지만 문제는 아니라고 말했습니까? 오류가 있습니까? 또는 쿼리가 예상 한 결과를 반환하지 않습니까? –

+0

문제는 코드의 "조인"버전을 사용할 때 위젯이 보이지 않는다는 것입니다. 나는 그것이 어떤 종류의 오류 때문에 있다고 생각합니다. 데이터베이스에서 직접 쿼리를 테스트하고 잘 작동합니다. Dreamweaver, 브라우저 오류 콘솔 또는 SE 제어판 오류 로그에 알릴 수있는 오류는 없습니다. 감사합니다 .--) – am71722

답변

0

코드의 또 다른 모습을 가진 후, 나는 문제가이 선하다고 생각 너 의도 한거야? 첫 번째 예는 engine4_user_fields_search에서 모든 열을 선택하는 것입니다. 두 번째 배열을 그 자리에두면 해당 테이블의 모든 열을 가져올 수 있습니다. 또한

이 :

$stmt = $db->query($select); 
$result = $stmt->fetchAll(); 

단지로 기록 될 수 있습니다 :

$result = $db->fetchAll($select); 

당신은 문자열로 당신에게 생성 된 쿼리를 줄 것이다, 단순히 개체 선택을 메아리로 Zend_Db_Select 문제를 디버깅 할 수 있습니다 :

echo $select; 

원시 SQL을 작성하려면 t 문자열로 쿼리 기능에 모자 : 여기

$db->query(" 
    SELECT * FROM engine4_user_fields_search as s 
    join engine4_user_fields_options as o 
    WHERE item_id = ? AND s.field_7+22 = o.option_id 
", array($user_id['user_id'])); 
0

내가 당신이 게시 한 코드에 문제가 볼 수 없습니다

 $opsDb = Engine_Db_Table::getDefaultAdapter(); 
    $ocrSelect = $opsDb->select() 
       ->from(array('ops'=>'engine4_user_fields_options'), array('field_id', 'option_id','label')) 
       ->join(array('map'=>'engine4_user_fields_maps'),'map.child_id = ops.field_id','') 
       ->join(array('meta'=>'engine4_user_fields_meta'),'map.`child_id` = meta.field_id', '') 
       ->where('map.option_id =?',$profileTypeId) 
       ->where('meta.type LIKE \'outcomeresult\''); 
    $outcomeResults = $opsDb->fetchAll($ocrSelect);