0

CActiveDataProvider で使用される CDbCriteria を作成しようとしています。多対多の関係の反対側で値を照会する必要があります。

次のテーブルがあります: order、user_order、user

リレーションは正しく宣言されているので、$order->users[0] にアクセスしてデータを正しく見ることができます。

私は次の基準を構築しようとしています:

$criteria=new CDbCriteria;
$criteria->with  = array('users');
if (isset($_SESSION['hideCard'])){
    $criteria->condition = "fname != 'Card'";
}

return new CActiveDataProvider(get_class($this), array(
    'criteria'=>$criteria,
    'pagination'=>array('pageSize'=>40)
));

これは基本的に、セッション変数が設定されている場合、DataProvider から fname が「Card」のすべてのユーザーを非表示にすることを意味します。

多対多の関係でこれを達成する方法についてのアイデアはありますか?

4

4 に答える 4

1

次のようにコードを変更する必要があります。

$criteria=new CDbCriteria;
$criteria->with  = array('users'); // or just string – 'users';
if (isset($_SESSION['hideCard'])){
    $criteria->together = true; // critical fix
    $criteria->condition = "users.fname != 'Card'"; // table alias must be set to ensure filtering proper column
}
于 2013-10-13T16:28:32.043 に答える
0

実行中のクエリでプロファイリングを実行し、独自のクエリの作成を開始しました。

これが機能するコードです...

public function searchRecent()
    {
        $criteria=new CDbCriteria;
        $criteria->with  = array('users');
        $criteria->join = 'LEFT JOIN user_order uo ON t.id = uo.order_id LEFT JOIN user u ON u.id = uo.user_id';
        $criteria->order     = 't.id DESC';
        if (isset($_SESSION['hideCard'])){
            $criteria->join .= " LEFT JOIN loyalty_members lm ON lm.user_id = u.id";
            $criteria->addCondition("magnetic_id IS NULL");
        }
        if (isset($_SESSION['hidePango'])){
            $criteria->addCondition("u.password != 'PANGO'", "AND");
        }
        $criteria->group = "t.id";
        return new CActiveDataProvider(get_class($this), array(
            'criteria'=>$criteria,
            'pagination'=>array('pageSize'=>40)
        ));
    }
于 2012-09-11T06:48:04.587 に答える
0

以下を使用できるはずです。

if (isset($_SESSION['hideCard'])){
    $criteria->condition = "users.fname != 'Card'";
}

または、ユーザーテーブルのエイリアスが何であれ、users関係名から推測しているだけです。

于 2012-09-10T08:14:07.213 に答える
0

CActiveDataProvider は、クラス名だけでなく、モデル インスタンスを取ることができます。これにより、モデル内のすべての基準を事前に設定できます。次に、モデルで「名前付きスコープ」を使用できます。例えば

$model = Order::model();

if (isset($_SESSION['someCond'])) {
    $model->someNamedScope();
}
if (isset($_SESSION['otherCond'])) {
    $model->otherNamedScope();
}

return new CActiveDataProvider($model, ...)
于 2012-09-13T07:33:57.150 に答える