【问题标题】:Complex ordering in CakePHP using ContainableCakePHP 中使用 Containable 的复杂排序
【发布时间】:2014-10-23 20:54:33
【问题描述】:

我对 Containable 行为有疑问。

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

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

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

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

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

编辑

好的,我会尽量不说不清楚的描述一下情况:

我有4个模型:UserCategoryFieldUserField,它们的关系如下:

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

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

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

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

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

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

如果本文不够清楚,我深表歉意,但对于愿意花一点时间阅读本文的人,我将非常感谢您的帮助!

【问题讨论】:

  • 您需要共享示例数据以及您希望如何对其进行排序。您所描述的内容没有多大意义,因为任何单个 A 的所有 B 都将排序相同。也许您想将 order 移动到外部数组(即 'A' => 数组级别)
  • 好的,我会编辑并尝试更具体地提供风景

标签: php cakephp containable


【解决方案1】:

我不知道你想要什么,但我认为应该使用 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
            ));

【讨论】:

  • 我刚刚编辑了我的问题,并提供了更多细节。我不认为加入对我来说是一个好的解决方案,因为这会给我大量的数据,因为我实际上有 4 个表,它们往往有很多记录。另外,我真的需要嵌套的数据,蛋糕的方式。 :(
【解决方案2】:

我终于想出了一个解决方案。我不知道它的效率如何,但它就是这样:

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

原始查询解决了我的问题。希望对遇到类似问题的人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多