2017-11-08 8 views
0

MSSQL 데이터베이스에서 쿼리를 작성하고 레코드를 가져 오려고합니다. 내가 쿼리 문자열을 준비하는 YII의 \ DB를 \ 쿼리 객체를 생성 : 그 후Yii 2 MSSQL QueryBuilder

$query = new Query; 
$query->select(['Name', 'PositionX', 'PositionY']) 
    ->from('mydb.dbo.position') 
    ->addOrderBy('PositionX DESC') 
    ->limit(100); 

을, 나는 YII \ DB를 \ 경우 MSSQL에 쿼리 객체를 추가 \ QueryBuilder

$qb = new QueryBuilder(\Yii::$app->db_mssql); 
$qb->build($query); 

지금은 같은 기록을 가져 오기 위해 필요 모델 예 :

$result = Position::findAll($qb); 

하지만 findAll() 던져 오류 :

Exception 'yii\db\Exception' with message 'Object of class yii\db\mssql\QueryBuilder could not be converted to string Failed to prepare SQL: SELECT * FROM [mydb].[dbo].[position] WHERE [Name]=:qp0'

어떻게해야합니까? :)

+0

간편한 쿼리 작성을 위해 find (http://www.bsourcecode.com/yiiframework2/select-query-model/) 메서드를 사용하십시오. –

답변

0
당신은 DB 접근 전략의 다른 유형 사이의 기능을 혼합하는

당신은

$myPositions = Yii::$app->db->createCommand('SELECT Name, PositionX, PositionY 
       FROM position order PositionX DESC limit 100 ') 
      ->queryAll(); 

로 만드는 명령을 사용할 수 있습니다 또는 당신은 당신이에 대한 모델 클래스 Posotion을 가정 할 액티브를 사용한다하여 위치 테이블

$myPositions = Position::find() 
     ->select(['Name', 'PositionX', 'PositionY']) 
     ->from('mydb.dbo.position') 
     ->orderBy('PositionX DESC') 
     ->limit(100)->all(); 

또는 사용 쿼리 빌더

$myPositions = (new \yii\db\Query()) 
    ->select(['Name', 'PositionX', 'PositionY']) 
    ->from('mydb.dbo.position') 
    ->orderBy('PositionX DESC') 
    ->limit(100) 
    ->all(); 
+0

예 유망 해 보이지만 : a) Yii :: $ app-> db- > createCommand()는 괜찮지 만 문자열에서 간단한 쿼리를 작성하는 것을 좋아하지 않습니다 (DB의 한 버전에서 다른 버전으로 이동할 때 코드 재 작성에 많은 시간이 소요됩니다). b) 이것은 정답입니다 :) c) yii \ db \ mssql \ QueryBuilder()가 없으면 MSSQL에서 작동하지 않습니다. 왜냐하면 "SELECT'Name'' from mydb'을 만들 것이기 ​​때문입니다. 'dbo '. 'position' " query with',하지만 MSSQL이 필요합니다. [ SELECT [이름] FROM [mydb]. [dbo]. [position]" 답변 해 주셔서 감사합니다! – tatarak

+0

테이블에 모델이없는 경우 , 첫 번째 의견에서 내 접근 방식보다 옳다, 난 그냥 QueryBuilder -> 빌드() :)에서 반환 된 배열을 나열했다 그리고 예를 들어 createCommand()에 사용 – tatarak

+0

난 undestand 당신이 코멘트 .. 제발 더 나은하시기 바랍니다. – scaisEdge