0

YiiのCDbCriteriaを使用してクエリを作成する方法を理解しようとしています。これは次のようになります。

 SELECT 
        * 
FROM 
        user u 
JOIN ( 
        SELECT * 
        FROM skill_assessment s 
        WHERE s.skill = 'HTML' 
        AND s.score >= 80 
) b ON 
        (u.id = b.userId) 
JOIN ( 
        SELECT * 
        FROM skill_assessment s 
        WHERE s.skill = 'CSS3' 
        AND s.score >= 80
) c ON 
        (u.id = c.userId);
etc...

これが私がこれまでに持っているものです、それは機能していません:

$criteria = new CDbCriteria();
$criteria->alias = "u";
$criteria->select = "*";
$criteria->join = "JOIN skill_assessment s ON (u.id=s.userId)";
for($i = 0; $i < count($skill_filters); $i++) {
    $criteria->addCondition("s.skill='".$skill_filters[$i]->skill."' AND s.score >= ".$skill_filters[$i]->level);
}

$users = UserModel::model()->findAll($criteria);

どんな助けでも大歓迎です。前もって感謝します。

編集:SQLクエリを文字列として作成し、findAllBySqlを使用して、検索条件に一致する正しいUserModelsを返すことができました。問題は、関連するSkillAssessmentModelsを返すように取得できなかったことです。次のように、最初のクエリでも返されません。

$users = UserModel::model()->with('skill_assessments')->findAllBySql($sql);

また、次のような結果が得られた場合も同様です。

$users = UserModel::model->findAllBySql($sql);
foreach($users as $user)
{
     $user->skill_assessments = $user->getRelated('skill_assessments');
}

これらの関連モデルを入手する方法について何か考えはありますか?奇妙なことに、アプリケーションの他の場所で、これを行うと関連するモデルを取得できます。

$user = UserModel::model->findByPk($id);
$user->skill_assessments->getRelated('skill_assessments');
4

3 に答える 3

2

の 2 番目のパラメータaddConditionはデフォルトです'AND'。これはあなたが探しているものですか?'OR'forを定義し$operatorて条件を囲む中括弧を追加する必要があるかもしれません。しかし、あなたの場合、 JOINではなく、ユーザーテーブルにaddCondition適用されます。

これはあなたのために働くはずだと思います:

$criteria = new CDbCriteria();
$criteria->alias = "u";
$criteria->together= "skill_assessment";
$where = array();

for($i = 0; $i < count($skill_filters); $i++) {
    $where[] = "(s.skill='".$skill_filters[$i]->skill."' AND s.score >= ".$skill_filters[$i]->level . ')';
}
$criteria->join = 'JOIN skill_assessment s ON (u.id=s.userId' . ( $where ? ( ' AND (' . join( ' OR ', $where ) . ')' ) : '') . ')';

$users = UserModel::model()->findAll($criteria);

次のように _skill_assessment_ を取得します。

foreach( $users->skill_assessment as $skill_assessment )
{
    echo $skill_assessment->userId;
}
于 2012-06-20T09:07:02.483 に答える
1

このレベルでは、シンプルに保ちます。

$sql="select * from mytable where id = :id";
$cmd = Yii::app()->db->createCommand($sql)->bindParam("id", $res_id);
$cmd->execute();
于 2012-06-20T06:22:34.080 に答える
0

ボリス・ベレンスキーに感謝!あなたが提案したことは、私が必要としていたものではありませでしたが、必要なものを得ることができました. これが私がその作品で終わったものです:

$str = "abcdefghijklmnopqrstuvwxyz";
            $idxs = str_split($str);

            $criteria = new CDbCriteria();
            $criteria->alias = "u";
            $joins = array();
            for($i = 0; $i < count($skill_filters); $i++)
            {
                $joins[] = " JOIN (SELECT * FROM skill_assessment s WHERE s.skill = '" . $skill_filters[$i]->skill ."' AND s.score >= " . $skill_filters[$i]->level . ") " . $idxs[$i] . " ON (u.id = " . $idxs[$i] . ".userId) ";
            }

            $criteria->join = join(' ', $joins);
            $users = UserModel::model()->findAll($criteria);
            foreach($users as $user)
            {
                $user->skill_assessments = $user->getRelated('skill_assessments');
            }

本当に重要な部分は、$joins 配列です。これにより、skill_assessments テーブルの行一致のすべての条件に一致するすべてのユーザーを取得できます。

また、通常のビューのビューでスキル評価を遅延ロードすることもできますが、ユーザーとの ajax 応答でそれらを返すために、各ユーザーのすべての skill_assessments を取得する必要があります。

于 2012-06-21T02:45:11.707 に答える