2013-12-10 2 views
0

У меня проблема с получением параметров Criteria и псевдонимов таблицы для работы. Мне нужно, чтобы получить этот запрос:Yii Присоединиться к подзапросу, как добавить параметры?

SELECT x.* FROM stl_election x 
JOIN (SELECT agent_id, economy_id, MAX(outcome) max_outcome FROM stl_election WHERE economy_id = 92 AND agent_id = 6203 GROUP BY stl_election.economy_id) y 
ON y.max_outcome-3 <= x.outcome 
AND y.economy_id = x.economy_id 
AND y.agent_id = x.agent_id 

Я уже сделал это:

$election = StlElection::model(); 
    $criteria = new CDbCriteria; 
     $criteria->select = "agent_id, economy_id, MAX(outcome) max_outcome"; 
     $criteria->condition = 'agent_id=:agent_id AND economy_id=:economy_id'; 
     $criteria->params = array(
      ':agent_id' => $agent->id, 
      ':economy_id' => $this->economy->id 
     ); 
     $criteria->group = 'stl_election.economy_id'; 


     $bestChoiceSql = $election->getCommandBuilder()->createFindCommand($election->getTableSchema(), $criteria)->getText(); 

     $criteria2 = new CDbCriteria; 

     $criteria2->join = '(' . $bestChoiceSql . ') y ON y.max_outcome-3 <= x.outcome 
    AND y.economy_id = x.economy_id 
AND y.agent_id = x.agent_id'; 
$criteria2->alias = 'x'; 

     $considerChoices = StlElection::model()->findAll($criteria2); 

Выход:

Invalid parameter number: no parameters were bound. The SQL statement executed was: SELECT `t`.`agent_id`, `t`.`party_id`, `t`.`economy_id`, `t`.`outcome` FROM `stl_election` `t` (SELECT agent_id, economy_id, MAX(outcome) max_outcome FROM `stl_election` `t` WHERE agent_id=:agent_id AND economy_id=:economy_id GROUP BY stl_election.economy_id) y ON y.max_outcome-3 <= x.outcome 
AND y.economy_id = x.economy_id 
AND y.agent_id = x.agent_id 
+0

Хорошо, я не знаю почему, но присвоение параметров $ критериям2 является таким Для этого. Еще проблема с псевдонимами ... – RobM

+0

Не могли бы вы проверить, что возвращает «$ this-> economy-> id»? нуль или что-то еще? –

+0

Я зарегистрировал его economy-> id = 92 и agent-> id = 6203. $ criteria-> массив params также отмечен – RobM

ответ

0

На мой взгляд, вы смотрите на это с самого SQL точка зрения и не столько точка зрения Yii. Я предлагаю вам изучить модельные отношения и функции CDbCriteria.

Обратите внимание, что для CDbCriteria, если вы собираетесь использовать функцию -> with(), обязательно включите -> together = true;

Yii CDbCriteria Class Reference

Простой ответ для вас может быть просто выполнить запрос SQL, попробуйте следующее:

$query = "SELECT x.* FROM stl_election x 
JOIN (SELECT agent_id, economy_id, MAX(outcome) max_outcome FROM stl_election WHERE economy_id = 92 AND agent_id = 6203 GROUP BY stl_election.economy_id) y 
ON y.max_outcome-3 <= x.outcome 
AND y.economy_id = x.economy_id 
AND y.agent_id = x.agent_id"; 

$result = Yii::app()->db->createCommand($sql)->queryAll(); 
+0

nope, я предпочитаю класс AciveRecord – RobM

0

Если кто-то заинтересован в ответ:

$election = StlElection::model(); 
    $criteria = new CDbCriteria; 
     $criteria->select = "agent_id, economy_id, MAX(outcome) max_outcome"; 
     $criteria->condition = 'agent_id=:agent_id AND economy_id=:economy_id'; 
     $criteria->params = array(
      ':agent_id' => $agent->id, 
      ':economy_id' => $this->economy->id 
     ); 
     $criteria->group = 'stl_election.economy_id'; 


     $bestChoiceSql = $election->getCommandBuilder()->createFindCommand($election->getTableSchema(), $criteria)->getText(); 

     $criteria2 = new CDbCriteria; 

     $criteria2->join = 'JOIN (' . $bestChoiceSql . ') y ON y.max_outcome-3 <= x.outcome 
    AND y.economy_id = x.economy_id 
AND y.agent_id = x.agent_id'; 
$criteria2->alias = 'x'; 

     $considerChoices = StlElection::model()->findAll($criteria2); 

Я просто пропустил 'JOIN' in -> join:/

Смежные вопросы