Хранение порядка сортировки для предметов, хранящихся в ассоциации HABTM - CakePHP - PullRequest
3 голосов
/ 01 июня 2009

В настройке ActiveRecord (со вкусом CakePHP) у меня есть настройка ассоциации HasAndBelongsToMany для видео и корзин: корзина может хранить n ссылок на видео, а видео может принадлежать n корзин .

Мне нужно иметь возможность вручную устанавливать и сохранять порядок отображения видео в определенной корзине (чтобы клиент мог размещать свои видео в определенном порядке в корзине). Сначала я хотел создать поле в корзине. который хранит массив идентификаторов видео в порядке их появления. Это самый эффективный способ справиться с этим?

Если да, то когда я получу результат запроса HABTM, какой самый чистый / эффективный способ переупорядочить возвращенный запрос, чтобы он соответствовал отсортированному массиву идентификаторов?

Видео, связанные с корзиной, возвращаются в виде массива:

[Video] => Array
            (
                [0] => Array
                    (
                        [id] => 49b2de95-0338-48b9-bc88-01ba35664358
                        ...

                    )

                [1] => Array
                    (
                        [id] => 49b1ccad-b770-410e-be46-03a035664358
                        ...
            )

Или есть лучший способ достичь того, что я пытаюсь сделать без использования ассоциаций HABTM?

Заранее спасибо -

Ответы [ 3 ]

6 голосов
/ 02 июня 2009

Что делать, когда HABTM усложняется?

По умолчанию при сохранении отношения HasAndBelongsToMany Cake удаляет все строки в объединяемой таблице перед сохранением новых. Например, если у вас есть клуб, в котором есть 10 детей. Затем вы обновите клуб с 2 детьми. Клуб будет иметь только 2 детей, а не 12.

Также обратите внимание, что если вы хотите добавить больше полей в объединение (когда оно было создано или метаданные), это возможно с помощью таблиц соединения HABTM, но важно понимать, что у вас есть простой вариант.

HasAndBelongsToMany между двумя моделями в действительности является сокращением для трех моделей, связанных как с hasMany, так и с принадлежащим ассоциацией.

Рассмотрим этот пример:

Child hasAndBelongsToMany Club

Еще один способ взглянуть на это - добавить модель членства

Child hasMany Membership
Membership belongsTo Child, 
ClubClub hasMany Membership.

Эти два примера почти одинаковы. Они используют одинаковое количество и именованные поля в базе данных и одинаковое количество моделей. Важные различия заключаются в том, что модель «соединения» названа по-разному, и ее поведение более предсказуемо.

В вашем примере вам нужен способ добавлять и удалять без редактирования других пользователей ссылки на видео, поэтому стандартный habtm вам не очень подойдет. Создайте модель для этого «соединения», аналогичную модели членства, описанной выше. Кроме того, если вы добавили поле веса, вы могли бы использовать упорядоченное поведение (которое я написал), чтобы упорядочить каждый набор видео для каждой корзины. Тогда вы будете использовать следующие поля

id, bin_id, video_id, weight

И установите bin_id как 'foreign_key' в конфигурации поведения. Удачи

2 голосов
/ 04 сентября 2009

Ну, я попытался решить именно эту проблему и думаю, что нашел самое простое из возможных решений:

При сохранении нового порядка связанных моделей вы удаляете существующие отношения и добавляете новые в нужном порядке. Это означает, что созданные идентификаторы выполняются в вашем порядке сортировки, и вы можете просто отсортировать по идентификатору, чтобы отобразить порядок.

public $hasAndBelongsToMany = array(
    'Item' => array(
        'order' => 'ItemFoldersItem.id ASC, Item.name DESC',
    )
);

Довольно просто, не правда ли?

0 голосов
/ 02 июня 2009

Не знаю о «наиболее эффективном» способе реализации того, что вы хотите, это зависит от всего вашего приложения и того, чего вы хотите достичь. Я бы просто помнил, что самое простое решение часто является лучшим.

Однако я могу дать вам совет по сортировке массива видео! Это довольно просто:

$yourData = Set::sort($yourData, '/Video/id', 'asc');

Взгляните на Класс Set , чтобы узнать больше конфет. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...