0

我有一个显示客户端数据的分页网格。假设我有一个表Client,其中有一个表name,其中的每一行都有电话号码,还有一个表,其中有每个客户的地址。所以每个都有很多s 和有很多es。lastNameaddressPhone_NumberClientAdressClientPhone_NumberAdress

关键是我正在尝试对网格的存储读取设置限制。因此,假设我设置了 limit = 2。网格每页应仅显示 2 行(2 个客户端)。问题是,例如,如果 client1 有两个电话号码,查询将带来两行,使网格只显示一个客户端。我知道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);
?>

另外,我认为描述了一个与您类似的案例。请注意,他/她正在显式更新条件参数,但 IMO 使用addCondition方法执行此操作更具可读性。

于 2012-06-01T19:04:31.947 回答
0

将条件与 join 语句一起使用。

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 来准备和执行您自己的查询并以您希望的格式返回数据。

或者您可以使用 CSQLDataProvier。最后 2 个选项使您可以更好地控制 SQL 语句

于 2012-06-01T21:08:13.637 回答