Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Yii中与和一起使用_Yii_Paging_Relation - Fatal编程技术网

在Yii中与和一起使用

在Yii中与和一起使用,yii,paging,relation,Yii,Paging,Relation,我有一个显示客户端数据的分页网格。 假设我有一个表Client,其中包含name、lastName和address,一个表Phone\u Number,其中包含Client中每一行的电话号码,还有一个表address,其中包含每个客户的地址。因此,每个客户机都有许多电话号码s和许多地址es 重点是我试图对网格的存储读取设置一个限制。 假设我设置了limit=2。网格每页应仅显示2行(2个客户端)。 问题是,例如,如果client1有两个电话号码,查询将产生两行,使得网格仅显示一个客户端。我知道在

我有一个显示客户端数据的分页网格。 假设我有一个表
Client
,其中包含
name
lastName
address
,一个表
Phone\u Number
,其中包含
Client
中每一行的电话号码,还有一个表
address
,其中包含每个客户的地址。因此,每个
客户机
都有许多
电话号码
s和许多
地址
es

重点是我试图对网格的存储读取设置一个限制。 假设我设置了limit=2。网格每页应仅显示2行(2个客户端)。 问题是,例如,如果client1有两个电话号码,查询将产生两行,使得网格仅显示一个客户端。我知道在查询中设置
在一起=>false
可以解决这个问题。但是,每当我将
设置在一起=>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));
如果我这样做,我会得到一个错误,比如:
找不到列:Address.s\u street\u name
。但是,如果我将
设置为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')).
我需要它像这样

(('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);
?>


另外,我认为描述了一个与你类似的案例。请注意,他/她正在显式更新参数,但我使用该方法进行更新更具可读性

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


或者您可以使用CSQLDataProvider。最后两个选项使您能够更好地控制SQL语句

如果取消限制,SQL语句是否会持续?