CakePHP:根据相关模型中的字段检索记录

时间:2011-04-08 18:50:13

标签: php search cakephp cakephp-1.3 relationship

我正在尝试根据相关模型中的字段进行搜索。我可以使用belongsTo模型,但不能使用hasMany模型。我确信这是一个简单的我忽略但我看不到它。有人能指出我正确的方向(甚至是我需要的蛋糕页面 - 搜索过,但没有发现任何看起来像这样的东西)。感谢

在群组控制器中:(这不起作用)

$group = $this->Group->find('all', array('conditions' => array('Voucher.id' => '55')));

这样做:

$group = $this->Group->find('all', array('conditions' => array('TourOperator.id' => '3')));

后台文件摘要:

小组模特:

var $belongsTo = array(
        'TourOperator' => array(
            'className' => 'TourOperator',
            'foreignKey' => 'tour_operator_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

    var $hasMany = array(
        'Voucher' => array(
            'className' => 'Voucher',
            'foreignKey' => 'group_id',
            'dependent' => true,
            'conditions' => '',
            'fields' => '',
            'order' => 'Voucher.date, Voucher.meal_type_id'         
        )
    );

优惠券型号:

var $belongsTo = array(
        'Group' => array(
            'className' => 'Group',
            'foreignKey' => 'group_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

旅行社模型:

var $hasMany = array(
    'Group' => array(
        'className' => 'Group',
        'foreignKey' => 'tour_operator_id',
        'dependent' => false,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    )
);

更新(如下面的评论中所述,但在此处阅读更清楚)

我最终使用了它。

$groups = $this->Group->Voucher->find('all', array('fields' => 'DISTINCT group_id', 'conditions' => array('Voucher.status' => 'pending')));
$group_ids = Set::extract($groups, '/Voucher/group_id');
$data = $this->Group->find('all', array('conditions' => array('Group.id' => $group_ids)));

我得到一个与我的标准匹配的不同组ID列表,创建一个只包含ID的数组,然后使用它来拉取组,以便按照我在视图中的预期对数组进行排序。

2 个答案:

答案 0 :(得分:0)

使用CakePHP的Containable行为,您无法在hasMany和hasAndBelongsToMany关联中使用相关数据的条件。这是因为它使用单独的查询来获取这些关联。

但是,通过可链接行为,您可以使用hasMany关联中的数据来过滤记录。可以在此处下载此行为:https://github.com/Terr/linkable

Linkable使用标准JOIN来加入相关数据。这意味着它不会提取所有相关数据(即与您的组相关的所有优惠券),就像普通的SELECT一样。但是,它可以与Containable一起使用。

您可以在自述文件中找到Linkable如何工作的示例。

(免责声明:我目前维护Linkable,但这不是我指向它的原因)

答案 1 :(得分:0)

您可以将查询重新转发到$this->Voucher->find,然后使用该查询返回的关联组数据吗?正如你所说,通过TourOperator id找到组是没有问题的,而Groups / Voucher关系看起来就像是它的反面。