Связи моделей Cakephp и количество запросов mysql, которые им требуются - PullRequest
0 голосов
/ 30 июня 2010

У меня довольно простая модель данных, но у меня есть центрическая сущность под названием «элемент», которая связана с 7 другими сущностями через отношения 1-к-1/1-ко-многим.Все работает гладко.Но в большинстве действий, которые работают с моделью элемента, мне не нужны какие-либо ассоциации из модели элемента - поэтому mysql завершает выполнение множества ненужных запросов (из-за ассоциации, определенной в классе модели "item").

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

Другой вариант - просто использовать bindModel / unbindModel везде, где это имеет смысл.

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

Любая обратная связь будет отличной:)

Ответы [ 3 ]

1 голос
/ 30 июня 2010

Не используйте рекурсив.Не удаляйте свои ассоциации.

В app_model.php добавьте (на уровне класса):

var $actsAs = array('Containable');

Затем используйте

$this->MyModel->contain();

или

$this->MyModel->contain(array('AssocThing.field','OtherThing.SubThng.field'));

для управления таблицами и полями, которые вы извлекаете.

Containable даст вам детальный контроль над данными, которые вы извлекаете.Вот для чего!

1 голос
/ 30 июня 2010

Перед выдачей find () установите рекурсивное свойство равным 0:

$this->Model->recursive = 0;
0 голосов
/ 30 июня 2010

Я бы сначала использовал unbindModel () .Тогда я бы использовал Containable поведение только в тех контроллерах или моделях, где недостаточно использовать только unbindModel ().Иногда недостаточно использовать bind / unbind илиableable, чтобы минимизировать количество запросов.Затем вы можете использовать опция 'joins' в запросах find ().

...