CakePHP выбирает много-много (HABTM) записей

После создания связи между многими (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.

-1

Решение

Вы должны следовать соглашениям о кодировании от 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 Таблица, так как оба поля совместно работают как первичный ключ.

0

Другие решения

Наконец-то нашел решение. В основном я сделал следующие шаги:

  1. Создал новый php-файл для представления модели отношений (по какой-то причине я понял, что CakePHP сделает это автоматически за кулисами)

    App::uses('AppModel', 'Model');
    class NewsNewsCategory extends AppModel{
    var $belongsTo = array('News', 'NewsCategory');
    }
    
  2. Изменил мой код запроса ниже:

    this->data = $this->News->find('first', array('conditions' => array('News.id' => $id)), 'contain' => array('NewsCategory'));
    
  3. Наконец я ожидал получить результаты в том же массиве, как:

    $this->data['News']['NewsCategories'] //or anything like that
    

Но я обнаружил, что связанные записи NewsCategory были доступны в другой переменной:

$this->data['NewsCategory']

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

Спасибо вам всем. Я надеюсь, что это поможет другим людям в будущем.

0

Я думаю, что здесь есть проблема для 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 книги

-1
По вопросам рекламы [email protected]