Удаление атрибута принадлежит модели. Предупреждение. Модель 'x' не связана с моделью 'y'

Вопрос:

Я новичок в CakePHP, и мне нужно поддерживать/разрабатывать приложение CakePHP и бороться с удалением BelongsTo в одной из моделей.

Код был скопирован из другого проекта, который использовал намного больше связанных таблиц. В новом проекте мне не нужны отношения, потому что он создает LEFT JOINS в запросах, которые я действительно хочу избавиться, чтобы ускорить процесс. Поэтому я вошел в модель и удалил свойство $belongsTo..

Когда я перехожу на домашнюю страницу, я теперь предупреждаю:

Warning (512): Model "Product" is not associated with model "ParentProduct"
[CORE/Cake/Model/Behavior/ContainableBehavior.php, line 343]

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

Любая помощь оценивается.

Лучший ответ:

Поэтому я вошел в модель и удалил свойство $ attribTo

Потому что вы просите об этом

Эта ошибка отображается при неправильном использовании сдерживаемого поведения.

Например, рассмотрите User hasMany Article и следующий код:

$User->find('all', array(
    'contain' => array(
        'Article'
    )
));

Это вернет всех пользователей и их статьи (только), независимо от каких-либо других существующих ассоциаций.

Если запрошена ассоциация, которая не определена:

$User->find('all', array(
    'contain' => array(
        'Article',
        'Comment'
    )
));

Containable генерирует предупреждение, так что вы, разработчик, можете знать, что в ваших результатах не будет комментариев, которые либо указывают на опечатку, либо другую ошибку развития (Ah… it User <-Article <-Comment),

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

Ответ №1

Сообщение генерируется (скорее всего), потому что в вашем контроллере (сначала проверьте ParentProductsController) что-то вроде

$this->ParentProductsController->Product->find();

Эта ассоциация моделей больше не существует, потому что вы хотели избавиться от нее, поэтому нет возможности для ParentProducts вызвать Product. Вам нужно изменить такие вызовы

ClassRegistry::init('the_name_of_the_model');

(в этом случае ClassRegistry::init('Product');) или загрузите модель с помощью

$this->loadModel('Product');

Теперь это необходимо только при вызове моделей, не связанных с текущим контроллером. Если вы вызываете Product->find из Product->find ошибки не будет.

Хорошо, что причина ошибки.
Но теперь: я не рекомендую вам удалять ассоциацию. Там действительно нет необходимости, и вы удаляете логическую связь в коде, хотя он все еще присутствует в базе данных. Существуют и другие способы избежать левых объединений и бесполезных запросов к базе данных, не вырезая кому-то конечность.

Если вы хотите ускорить работу, прочитайте о Containable Behavior и установите для всех моделей значение $recursive = -1 (рекурсивный документ). Таким образом, вы не получите LEFT JOINS, если вы прямо не скажете об этом.

Оцените статью
TechArks.Ru
Добавить комментарий