使用Containable在CakePHP中进行复杂排序

时间:2014-10-23 20:54:34

标签: php cakephp containable

我遇到了包含行为的问题。

我想知道是否有任何方法可以访问所包含的模型属性以进行排序等操作。

例如,我有一个属于模型A的模型B.我需要使用A的属性(整数)来排序B的对象。它将类似于:

'contain' => array(
            'A' => array(
                'B' => array(
                    'order' => 'A.integer_attribute'
                )
            )
        )

我知道在没有Containable的情况下有更简单的方法可以做到这一点,但由于这里不值得详述的原因,我需要使用它。这是一个抽象的例子,事实上模型A属于其他模型,这只是深度可包含树的一小部分。

在任何帮助下我都会很高兴!

修改

好的,我会尽力描述情况,但不清楚:

我有4个模型:用户类别字段用户字段,他们的关系如下:

Category hasMany User
Category hasMany Field
User hasMany UserField
Field hasMany UserField

这些关系的反面都属于。这里的目的是用户属于一个类别,它有许多字段,他需要填写他的信息(城市,州等)。他填写的信息存储在UserField表中,因为每个信息都需要有它的字段和提供它的用户。

也就是说,我需要构建一个屏幕,为每个类别显示用户及其信息列表。因此,我检索所有类别及其字段,因此我可以为每个类别构建一个表。每个字段都有一个属性“no_order”,这是指示字段出现顺序的数字。

同时,我需要每个类别的所有用户在表格中正确显示它们。最后,还有问题,我需要为每个用户分别按其各自字段的“no_order”排序UserField对象。所以我最终得到了类似的东西:

$categories = $this->Category->find('all', array(
        'order' => 'Category.name',
        'contain' => array(
            'Field',
            'User' => array(
                'UserField' => array(
                    'order' => 'Field.no_order'
                )
            )
        )
    ));

但这不起作用,因为UserField无法从那里到达其各自的Field的no_order。

如果这不够明确,我道歉,但对于那些花一点时间读这篇文章的人,我会非常感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

我不确定你想要什么,但我应该在cakephp中使用连接

$A = $this->A->find('all', array(
             'joins' => array(
                  array(
                    'table' => 'B',
                    'alias' => 'B',
                    'type' => 'LEFT',
                    'conditions' => array(
                    'B.field_id = A.id'
                    )
                )
            ),
                'conditions' => array(
                'B.field' => 'if_you_want_more_conditions' 
            ),

               'contain' => array(
                   'A' => array(
                      'B' => array(
                         'order' => 'A.integer_attribute'
                        )
                   )
            ),
                'fields' => array('A.field','B.field'),
                'recursive' => -1
            ));

答案 1 :(得分:0)

我终于想出了一个解决方案。我不知道它有多高效,但它确实如此:

'contain' => array(
            'Field',
            'User' => array(
                'User.privilege = "Solicitante"'
                'UserField' => array(
                    'order' => '(SELECT f.no_order FROM fields AS f WHERE UserField.field_id = f.id LIMIT 1)'
                )
            )
        )

让原始查询解决了我的问题。希望它可以帮助遇到类似问题的人!