#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.