0

クライアント データを表示するページング付きのグリッドがあります。を含むテーブルがあり、その中に、各行の電話番号を持つテーブルClientname、各クライアントの住所を持つテーブルがあるとします。したがって、それぞれにHAS MANYと HAS MANY があります。lastNameaddressPhone_NumberClientAdressClientPhone_NumberAdress

ポイントは、グリッドのストア読み取りに制限を設定しようとしているということです。それでは、制限 = 2 を設定するとします。グリッドには、1 ページ (2 クライアント) あたり 2 行のみが表示されます。問題は、たとえば、client1 に 2 つの電話番号がある場合、クエリによって 2 つの行が表示され、グリッドに 1 つのクライアントのみが表示されることです。together=>falseクエリで設定するとこれが解決することを認識しています。しかし、設定するたびに不明な列エラーが発生しますtogether=>false

これが私が使用しているコードです....

Client::model()->with(
      'clientPhoneNumbers',
      'clientPhoneNumbers'.'PhoneNumber',
      'clientAddresses',
      'clientAddresses'.'Address'
)->findAll(array(condition=>(('Address.s_street_name LIKE :queryString') OR ('PhoneNumber.n_number LIKE :queryString')), params=>$params, order=>$order, limit=>$limit,together=>false));

これを行うと、次のようなエラーが発生しますColumn not found: Address.s_street_name。ただし、 を設定するtogether=>trueと、「正常に」動作します。

このようなクエリを実行することで、この問題の解決策を見つけました....

$with = array(
      'clientPhoneNumbers',
      'clientPhoneNumbers'.'PhoneNumber'=>array(condition=>('PhoneNumber.n_number LIKE :queryString'), params=>array(':queryString'=>$queryString)),
      'clientAddresses',
      'clientAddresses'.'Address'=>array(condition=>('Address.s_street_name LIKE :queryString'), params=>array(':queryString'=>$queryString))
);

Client::model()->findAll(array(with=>$with, order=>$order, limit=>$limit,together=>false));

問題は、私がこのようにすると、条件は次のようになります

(('Address.s_street_name LIKE :queryString') AND ('PhoneNumber.n_number LIKE :queryString'))

そして、私はそれがこのようになる必要があります

(('Address.s_street_name LIKE :queryString') OR ('PhoneNumber.n_number LIKE :queryString')).

何か案は ?

リレーションとテーブルの名前は実際の名前ではないことに注意してください。Gii を使用して作成されたモデルと関係

4

2 に答える 2

0

うーん..これは私がそれを試す方法です。

<?php
$criteria=new CDbCriteria;
$criteria->with = array('clientPhoneNumbers', 'clientAddresses');
$criteria->together = true;
$criteria->addCondition(array('Address.s_street_name LIKE :queryString', 'PhoneNumber.n_number LIKE :queryString'), 'OR');    
$criteria->params = array(':queryString' => $queryString);
$criteria->limit = $limit;
$criteria->order = $order;

$result = Client::model()->findAll($criteria);
?>

また、これはあなたに似たケースを説明していると思います。条件パラメーターを明示的に更新していることに注意してください。ただし、 addConditionメソッドを使用して IMO を実行する方が読みやすいです。

于 2012-06-01T19:04:31.947 に答える
0

結合ステートメントで条件を使用します。

public function test()
{
    $criteria=new CDbCriteria;
    $criteria->alias = 'i';
    $criteria->compare('id',$this->id);     
    .........
            .........

    $criteria->join= 'JOIN phoneNUmbers d ON (i.id=d.id)';

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
        'sort'=>array(
            'defaultOrder'=>'clients ASC',
        ),
    ));
}

または、DAO を使用して独自のクエリを準備および実行し、必要な形式でデータを返します。

または、CSQLDataProvider を使用できます。最後の 2 つのオプションを使用すると、SQL ステートメントをより詳細に制御できます。

于 2012-06-01T21:08:13.637 に答える