将自定义 sql 查询转换为数据提供程序 yii?

use*_*888 1 mysql yii dataprovider

我正在尝试将以下查询转换为数据提供程序,以便它可以显示在 CGridView 中。我曾尝试使用 CArrayDataProvider,但到目前为止还没有任何运气,任何帮助将不胜感激!

这是查询

public function getTeamsByLevelIdAndCompetitionId($levelId, $competitionId) 
{
    $query = "SELECT t.*, 
         (SELECT COUNT(*) 
    FROM tbl_competition_teams ct
    WHERE ct.team = t.id
    AND ct.competition = :competitionId) AS 'inCompetition'
    FROM tbl_teams t 
    WHERE t.level = :levelId";

    $params = array(
        'levelId' => $levelId,
        'competitionId' => $competitionId
    );

    $result = array();
    $teams = $this->findAllBySQL($query, $params);
    return $teams;
}
Run Code Online (Sandbox Code Playgroud)

这就是我尝试将其放入 CArrayDataProvider 的方式:

public function getTeamsByLevelIdAndCompetitionId($levelId, $competitionId) 
{
    $rawData = Yii::app()->db->createCommand("SELECT t.*, 
         (SELECT COUNT(*) 
    FROM tbl_competition_teams ct
    WHERE ct.team = t.id
    AND ct.competition = :competitionId) AS 'inCompetition'
    FROM tbl_teams t 
    WHERE t.level = :levelId")->queryAll();

    $params = array(
        'levelId' => $levelId,
        'competitionId' => $competitionId
    );

    return new CArrayDataProvider($rawData, array(
    'id'=>'id',
        'sort'=>array(
        'attributes'=>array(
         'id', 'title', 'club', 'level', 'inCompetition',
    ),
),
Run Code Online (Sandbox Code Playgroud)

)); }

但这给了我错误“CDbCommand 无法执行 SQL 语句:SQLSTATE[HY093]:无效的参数号:没有绑定参数。”

这是我的团队表

CREATE TABLE `tbl_teams` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(35) NOT NULL DEFAULT '',
  `level` int(10) unsigned DEFAULT NULL,
  `club` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2952 ;
Run Code Online (Sandbox Code Playgroud)

和我的参赛队表

CREATE TABLE `tbl_competition_teams` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `competition` int(10) unsigned NOT NULL DEFAULT '0',
  `team` int(10) unsigned NOT NULL DEFAULT '0',
  `seasonId` int(11) NOT NULL DEFAULT '3',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=126320 ;
Run Code Online (Sandbox Code Playgroud)

预先感谢一百万的任何建议!

use*_*891 5

也许问题是你 queryAll() 执行查询。此时,您没有将值分配给您的参数

$rawData = Yii::app()->db->createCommand("SELECT t.*, 
         (SELECT COUNT(*) 
    FROM tbl_competition_teams ct
    WHERE ct.team = t.id
    AND ct.competition = $competitionId) AS 'inCompetition'
    FROM tbl_teams t 
    WHERE t.level = $levelId")->queryAll();
Run Code Online (Sandbox Code Playgroud)

您也可以尝试重写您的查询。

$query = "SELECT t.*, 
         (SELECT COUNT(*) 
            FROM tbl_competition_teams ct
            WHERE ct.team = t.id
            AND ct.competition = :competitionId) AS 'inCompetition'
        FROM tbl_teams t 
        WHERE t.level = :levelId";

$command= Yii::app()->db->createCommand($query);
$command->bindValue(':levelId', $levelId);
$command->bindValue(':competitionId', $competitionId);
$rawData = $command->queryAll();
Run Code Online (Sandbox Code Playgroud)