Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.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
paginate中的Cakephp子查询_Php_Cakephp_Cakephp 2.x - Fatal编程技术网

paginate中的Cakephp子查询

paginate中的Cakephp子查询,php,cakephp,cakephp-2.x,Php,Cakephp,Cakephp 2.x,我有一个现有的cakephp(版本2)控制器索引函数,可以执行以下操作: $options = ['Person.name LIKE' => $term]; $this->set('people', $this->Paginator->paginate($options)); 在视图中生成分页表 My Person模型引用了一个预约的子模型,其中一个人有多个预约,如下所示: public $hasMany = [ 'Appointment' => [

我有一个现有的cakephp(版本2)控制器索引函数,可以执行以下操作:

$options = ['Person.name LIKE' => $term];
$this->set('people', $this->Paginator->paginate($options));
在视图中生成分页表

My Person模型引用了一个预约的子模型,其中一个人有多个预约,如下所示:

public $hasMany = [
    'Appointment' => [
        'className' => 'Appointment',
        'foreignKey' => 'person_id',
        'dependent' => false
    ]
]
我现在需要将一个人最早的约会日期列添加到我的表中,即,如果使用原始SQL,我可能会这样做:

select 
    Person.id,
    Person.name,
    (select 
        min(Appointment.Date) from Appointment
        where Appointment.person_id = Person.id
    ) as OldestAppointmentDate
from Person
where Person.name like 'foo%'

如何修改paginate()参数,使此新字段包含在结果中,并以通常方式按paginate排序?

最简单的方法可能是使用虚拟字段,然后可以将其包含在paginators
fields
选项中,类似于:

// in Model/Person.php

public $virtualFields = array(
    'OldestAppointmentDate' => '
        select
            min(Appointment.Date)
        from
            Appointment
        where
            Appointment.person_id = Person.id
    ';
);
这将包括子查询,并相应地创建所需的别名,所有内容将自动缝合在一起,使结果看起来像是
oldestappointdate
Person
的实际字段,您可以像其他任何字段一样在paginator帮助器中引用它,即:

$this->Paginator->sort('Person.OldestAppointmentDate');
另见


最简单的方法可能是使用虚拟字段,然后可以将其包含在分页器
字段
选项中,例如:

// in Model/Person.php

public $virtualFields = array(
    'OldestAppointmentDate' => '
        select
            min(Appointment.Date)
        from
            Appointment
        where
            Appointment.person_id = Person.id
    ';
);
这将包括子查询,并相应地创建所需的别名,所有内容将自动缝合在一起,使结果看起来像是
oldestappointdate
Person
的实际字段,您可以像其他任何字段一样在paginator帮助器中引用它,即:

$this->Paginator->sort('Person.OldestAppointmentDate');
另见


效果很好,谢谢。作为对self的一个提醒,为了其他人的利益,在我的例子中,我发现我必须在模型的构造函数中设置
virtualFields
,如下所述:这很好,谢谢。作为对self的一个提醒,为了其他人的利益,我发现我必须在模型的构造函数中设置
virtualFields
,如下所述: