У меня три стола
- сообщения
- метка
- posts_tags
Мне нужно написать некоторую логику контроллера, которая выбирает и устанавливает все сообщения с тегом work
Это означает запрос tags
для поиска id
для запрашиваемого тега, проверка в соответствующей таблице posts_tags
для поиска совпадений, использование post_id
для возврата правильных сообщений из таблицы сообщений.
Я не уверен, как вообще начать этот запрос, я новичок в CakePHP и могу использовать руку ... Пожалуйста?
Если это поможет, вот мои отношения с моделями сообщений:
var $hasAndBelongsToMany = array(
'Tag' => array(
'className' => 'Tag',
'joinTable' => 'posts_tags',
'foreignKey' => 'posts_id',
'associationForeignKey' => 'tag_id',
'unique' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'deleteQuery' => '',
'insertQuery' => ''
)
);
Моя таблица тегов состоит из двух полей: id
и tag
Моя таблица PostsTag состоит из трех полей: id
, tag_id
и post_id
Таблица «Мои сообщения» состоит из четырех полей: id
, title
, body
и created
Я нашел некоторый код в Книге CakePHP, который показывает следующий код:
$this->Recipe->Tag->find('all', array('conditions'=>array('Tag.name'=>'Dessert')));
Они предположили, что это была похожая идея, поэтому я попытался приспособиться:
$this->Post->Tag->find('all', array('conditions'=>array('Tag.tag'=>'work')));
Однако это не сработало. Возвращает все сообщения без фильтрации.
Я воспользовался советом @Leo и попытался адаптировать его код к моему:
function getArticleByTagSql($tag) {
$dbo = $this->getDataSource();
$subQuery = $dbo->buildStatement(
array(
'fields' => array('DISTINCT(ArticlesTag.article_id)'),
'table' => "articles_tags",
'joins' => array(
array('table' => 'tags',
'alias' => 'Tag',
'type' => 'INNER',
'conditions' => array('ArticlesTag.tag_id = Tag.id')
)
),
'alias' => "ArticlesTag",
'conditions' => array("Tag.tag" => $tag),
'order' => null,
'group' => "ArticlesTag.article_id",
'limit' => null
),
$this
);
$subQuery = ' Article.id IN (' . $subQuery . ')';
return $dbo->expression($subQuery);
}
Контроллер:
$this->set('articles', $this->paginate(array(
'conditions' => $this->Article->getArticleByTagSql('work')
)));
Однако, что бы я ни вводил в качестве ключа в методе paginate () - в этом случае «условия» появляются в запросе, и я не могу понять, почему - я продолжаю получать неизвестные столбцы «условия» с ошибками. Ошибка в функции paginate, без нее данные возвращаются правильно, но я не могу использовать paginator без нее. Это как улов 22 * 1052 *
Приветствия
Dan