Комплексный заказ в CakePHP с использованием Containable

У меня проблема с поведением Containable.

Я хотел бы знать, есть ли какой-либо способ доступа к атрибутам содержащейся модели для таких операций, как упорядочение.

Например, у меня есть модель B, которая принадлежит модели A. Мне нужно упорядочить объекты B, используя атрибут (целое число) из A. Это было бы что-то вроде:

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

Я знаю, что есть более простые способы сделать это без Containable, но по причинам, которые здесь не стоит подробно описывать, мне нужно его использовать. Это абстрактный пример, в действительности модель A принадлежит другим моделям, и это лишь малая часть глубокого содержимого дерева.

Буду очень рад любой помощи!

РЕДАКТИРОВАТЬ

Хорошо, я постараюсь описать ситуацию, не будучи неясным:

У меня 4 модели: пользователь, категория, поле а также UserField, и их отношения следующие:

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

Противоположность этих отношений все принадлежит. Цель в том, чтобы пользователь принадлежал к категории, в которой есть много полей, которые ему необходимо заполнить своей информацией (город, штат и т. Д.). Информация, которую он заполняет, хранится в таблице 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 не может получить оттуда соответствующее поле no_order.

Я прошу прощения, если это не было достаточно ясно, но для любого, кто потратил бы немного времени, читая это, я был бы ОЧЕНЬ благодарен за вашу помощь!

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

Наличие необработанного запроса решило мою проблему. Надеюсь, это поможет всем, кто сталкивается с подобной проблемой!

0