我有一个带有分页功能的网格,用于显示客户端数据。 假设我有一张表
Client
,其中有 name
、lastName
和 address
,一张表 Phone_Number
,其中有 Client
中每一行的电话号码,还有一张表 Adress
,其中有每个客户的地址。所以每个Client
都有很多Phone_Number
并且有很多Adress
es。
重点是我试图对网格的存储读取设置限制。 假设我设置 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 创建的模型和关系
嗯..这就是我尝试的方法。
<?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);
?>
另外,我认为this描述了与您类似的案例。请注意,他/她正在显式更新 condition 参数,但在我看来,使用 addCondition 方法执行此操作更具可读性。
将条件与连接语句一起使用。
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 语句