提问者:小点点

CakePHP中使用Containable的复杂排序


我对可控制行为有问题。

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

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

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

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

如果有任何帮助,我将非常高兴!

编辑

好的,我会尽我所能描述情况,不要含糊不清:

我有4个模型:用户、类别、字段和用户字段,它们之间的关系如下:

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

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

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

同时,我需要每个类别的所有用户在表中正确显示它们。最后,还有一个问题,我需要让UserField对象按照其各自字段的“no_顺序”为每个用户排序。所以我最终得到了这样的结果:

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

但这不起作用,因为UserField无法从那里到达其各自字段的no_顺序。

如果这还不够清楚,我很抱歉,但是对于任何愿意花一点时间阅读这篇文章的人,我将非常感谢你的帮助!


共2个答案

匿名用户

我不是舒尔,但我认为应该使用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
            ));

匿名用户

我终于想出了一个解决办法。我不知道它有多有效,但它是这样的:

'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)'
                )
            )
        )

原始查询解决了我的问题。希望它能帮助任何遇到类似问题的人!