Yiiのフレームワークの中で複雑なクエリを基準にする方法?

StackOverflow https://stackoverflow.com/questions/4021890

  •  26-09-2019
  •  | 
  •  

質問

私はこのようなクエリを持っています

SELECT * FROM activity
WHERE (((userId = 1 OR userId IN(SELECT userId FROM follower WHERE followerId = 1))
AND activityType IN(1, 2, 3))
OR (targetId = 24 AND aType IN(1, 2, 3, 4, 5)))
ORDER BY id DESC;

私はmodel()->findAllBySql($sql)を使用しようとしている、それが動作します。あなたは別のソリューションを持っている場合しかし、私は、それがCDbCriteriaを使用したい私はそれを知っている:D

役に立ちましたか?

解決

CDbCriteriaと思うと...のようなもの

あなたはまだこの文を構築することができます:

$criteria=new CDbCriteria;
$criteria->condition = '
  (
    (
      userId = 1 OR 
      userId IN (SELECT userId FROM follower WHERE followerId = 1)
    )
    AND activityType IN(1, 2, 3)
  )
  OR (
    targetId = 24 
    AND aType IN(1, 2, 3, 4, 5)
  )
';
$criteria->order = 'id DESC';
$results=Activity::model()->findAll($criteria);

この点としてあなたにも普通のSQL文を書くかもしれないが、それをこのように行うにはいくつかの利点があるかもしれません:結合パラメータ、基準をマージ、追加の基準などを追加する

他のヒント

長いあなたのプレーンなSQLの作品などとして、あなたがしている安全。私は離れてアクティブレコードを投げるだけ老い正気の方法で仕事を得るために持っている多くの時間があります。

私が読めるCDbCriteriaの建設には、このクエリを翻訳してみました。悪いアイデア。それは複雑なデータを照会するために来るときYiiは吸うます。

答えがここで見つけることができます: http://www.yiiframework.com/doc /guide/1.1/en/database.dao#executing-sql-statementsする

あなたのケースでは、

$sql = 'SELECT * FROM activity';
$sql .= 'WHERE (((userId = 1 OR userId IN(SELECT userId FROM follower WHERE followerId = 1))';
$sql .= 'AND activityType IN(1, 2, 3))';
$sql .= 'OR (targetId = 24 AND aType IN(1, 2, 3, 4, 5)))';
$sql .= 'ORDER BY id DESC';

$connection = Yii::app()->db;
$command = $connection->createCommand($sql);
$results = $command->queryAll();

@pestaaは時々あなたが窓の外にアクティブなレコードを投げるために持っていることを右です。あなたは、多くのモデルをループすることは恐ろしく非効率的である質量の更新をやっている場合、これは特にそうです。

ただ、使用CSqlDataProvider http://www.yiiframework.com/doc/api/1.1/CSqlDataProviderする

免責事項:私はそれがこのparticural質問に対する正確な答えではないと知っているが、それは与えられた問題を回避を助けるかもしれません。私はこの質問の主な目的は、任意のSQLでCGridView、CListViewなどを使用する方法を取得している疑います。

私はCDbCriteria機能を使用する複雑なクエリのためwithを使用します。

あなたはこのように複雑な基準を構築することができます:

$dbCriteria->with=array(
   '<relation1>'=>array( 'condition'=>'<condition for given relation>',
        'with'=>array('<relation2:relation of relation1>'
            =>array(<conditions for relation2>)
        )
        'scopes'=><scopes for relation1>
    )
);

私はORがここに遊びに取得することができますどのようにチェックしていません。

スコープを使用することにより、あなたはまた、いくつかのより複雑な基準を挿入し、まだ読める検索条件を維持することができます。

これはかなり強力です。私はこれについて、完全な「チュートリアル」をまだ見ていませんでした。 I種類のソースコードからこれを締結します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top