После создания связи между многими (HABTM) между двумя классами (как показано ниже) я ожидал увидеть результаты, включая связанные записи, но по какой-то причине этого не происходит.
модели
App::uses('AppModel', 'Model');
class NewsCategory extends AppModel{
public $hasAndBelongsToMany = array('News');
}
App::uses('AppModel', 'Model');
class News extends AppModel{
public $hasAndBelongsToMany = array('NewsCategory');
}
Я создал таблицу под названием «news_news_categories» с идентификатором обеих таблиц.
контроллер
this->data = $this->News->find('first', array('conditions' => array('News.id' => $id)));
Результат из приведенного выше кода не включает соответствующие записи NewsCategory.
Потратив часы на то, чтобы это произошло, я не смог этого сделать.
Что мне здесь не хватает?
Спасибо всем заранее!
Обновить
Когда я дам дамп кода SQL, используемого CakePHP с помощью
echo $this->element('sql_dump');
результаты не показали никакого запроса (или присоединения) для этого отношения. CakePHP просто игнорирует конфигурацию $ hasAndBelongsToMany.
Вы должны следовать соглашениям о кодировании от CakePHP, или ваш код будет просто Not work as expected
или вам придется использовать грязные трюки, такие как $useTable = etc
,
Ваша проблема в том, что ваше имя таблицы для HABTM должно быть
1.Все строчные буквы
2. Должны быть имена обеих таблиц (во множественном числе).
3. Названия таблиц (т.е. слова) должны быть в алфавитном порядке /
4. Между именами таблиц должно быть подчеркивание.
Согласно правилам имя вашей таблицы должно быть news_news_categories
,
Также убедитесь, что в вашей таблице news_news_categories
у вас есть внешние ключи, такие как news_id
а также news_category_id
, И убедитесь, что у вас нет первичного ключа (например, id) в news_news_categories
Таблица, так как оба поля совместно работают как первичный ключ.
Наконец-то нашел решение. В основном я сделал следующие шаги:
Создал новый php-файл для представления модели отношений (по какой-то причине я понял, что CakePHP сделает это автоматически за кулисами)
App::uses('AppModel', 'Model');
class NewsNewsCategory extends AppModel{
var $belongsTo = array('News', 'NewsCategory');
}
Изменил мой код запроса ниже:
this->data = $this->News->find('first', array('conditions' => array('News.id' => $id)), 'contain' => array('NewsCategory'));
Наконец я ожидал получить результаты в том же массиве, как:
$this->data['News']['NewsCategories'] //or anything like that
Но я обнаружил, что связанные записи NewsCategory были доступны в другой переменной:
$this->data['NewsCategory']
(и не вложенный в массив результатов News, как я сначала предположил)
Спасибо вам всем. Я надеюсь, что это поможет другим людям в будущем.
Я думаю, что здесь есть проблема для CakePHP Conventions. Таким образом, вы просто указываете имя таблицы использования в своих моделях.
как
App::uses('AppModel', 'Model');
class NewsCategory extends AppModel{
public $useTable = 'news_categories';
// This model uses a database table 'news_categories'
public $hasAndBelongsToMany = array('News');
}
App::uses('AppModel', 'Model');
class News extends AppModel{
public $useTable = 'news'; // This model uses a database table 'news'
public $hasAndBelongsToMany = array('NewsCategory');
}
Также читайте CakePHP книги