cakephp — соседние записи с типом тега

#php #sql #cakephp

#php #sql #cakephp

Вопрос:

У меня есть три таблицы базы данных, news , news_n_types и n_types .

n_types Таблица заполнена различными типами тегов новостей.

news_n_types Таблица сопоставляется n_types с news .

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

Пока что, если я попробую следующее, все работает, но он ищет любое новостное сообщение, а не только сообщения этого типа.

 $this->News->bindModel(array('hasOne' => array('NewsNType')));
        $neig = $this->News->find('neighbors', array(
            'fields' => array('News.*')
        ));
  

Если я добавляю условие для фильтрации типа новостей, я получаю ошибку sql (ошибка SQL: 1054: Неизвестный столбец ‘NewsNType.n_type_id’ в ‘предложении where’)

 $this->News->bindModel(array('hasOne' => array('NewsNType')));
        $neig = $this->News->find('neighbors', array(
            'fields' => array('News.*'),
            'conditions' => array('NewsNType.n_type_id' => $typeID)
        ));
  

Что я делаю не так?

Обновление по запросу

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

app/controllers/news_controller.php (строка 102)

 Array
(
[prev] => 
[next] => Array
    (
        [News] => Array
            (
                [id] => 1
                [title] => TEST 1
                [date] => 1319935806
                [body] => TEST 1
                [excerpt] => TEST 1
            )

        [NType] => Array
            (
                [0] => Array
                    (
                        [id] => 1
                        [label] => Blog
                        [slug] => blog
                        [NewsNType] => Array
                            (
                                [id] => 25
                                [news_id] => 1
                                [n_type_id] => 1
                            )

                    )

                [1] => Array
                    (
                        [id] => 2
                        [label] => Industry News
                        [slug] => industry_news
                        [NewsNType] => Array
                            (
                                [id] => 26
                                [news_id] => 1
                                [n_type_id] => 2
                            )

                    )

            )

    )
  

)

Комментарии:

1. Можете ли вы опубликовать пример данных, возвращенных первым запросом?

2. @David Gallagher Я добавил больше информации

3. Поскольку next имеет идентификатор 1, я бы не ожидал, что есть prev. Что меня больше беспокоило бы, так это тот факт, что в вашем next нет NewsNType .

4. Обновлены результаты после переключения рекурсивности на 1.

Ответ №1:

После некоторого тестирования я обнаружил, что при использовании find('neighbors') этого способа невозможно использовать условия в другой таблице. Вам нужно выполнить объединение:

 $joins = array(
    array('table' => 'news_n_types',
        'alias' => 'NewsNType',
        'type' => 'LEFT',
        'conditions' => array(
            'NewsNType.news_id = News.id',
        )
    )
);
$conditions = array('NewsNType.n_type_id' => $typeID);
$neig = $this->News->find('neighbors', array('field' => 'id', 'value' => 1, 'joins' => $joins, 'conditions' => $conditions));
  

Ответ №2:

Согласно документации

[find(‘neighbors’)] не поддерживает рекурсивный параметр модели по умолчанию. Рекурсивная настройка должна передаваться в параметрах при каждом вызове.

Попробуйте использовать:

 $neig = $this->News->find('neighbors', array(
        'fields' => array('News.*'),
        'conditions' => array('NewsNType.n_type_id' => $typeID),
        'recursive' => 1
    ));
  

Комментарии:

1. Я обновил свой первый пост результатами после установки recursive равным 1.