У меня проблема с условиями поиска cakePHP. У меня есть модель клуба, модель пользователя и Почтовая модель:CakePHP - найти условия с ассоциациями
клуб hasMany Сообщение
клуб HABTM Пользователь
В принципе, мой стол clubs_users также содержит дополнительные поля, такие как, скажем, «предел» и " diff ', которые соответственно указывают максимальное количество сообщений, которые пользователь хочет отобразить, и сколько лет эти должности разрешены. Я хотел бы выбрать соответствующие должности для каждого клуба, связанные с данным пользователем. Я делаю примерно такой
$clubs = $this->Club->User->find('first', array(
'conditions' => array('User.id' => $id),
'contain' => array(
'Club' => array(
'fields' => array(
'id',
'name'
),
'Post' => array(
'fields' => array(
'id',
'title',
'description',
'created',
),
'order' => array('Post.created' => 'DESC'),
'conditions' => array(
'DATEDIFF(NOW(), `Post.created`) <= /* 1 */',
),
'limit' => '/* 2 */'
)
)
)
));
Что я должен поставить вместо 1 и 2 для этого? Я попробовал ClubsUser.diff и ClubsUser.limit, но у меня возникла ошибка, указав, что эти поля неизвестны в предложении where.
Любая помощь будет радушна.
Спасибо за чтение.
редактировать
После комментария bancer, я смотрел глубже в документ MySQL, и оказалось, что LIMIT ожидает только числовые аргументы. Поэтому теперь я просто хочу вернуть сообщения, которые не слишком стары. Моя новая находка (с действительным именем поля)
$overview = $this->Club->Follower->find('first', array(
'conditions' => array('Follower.id' => $this->Auth->user('id')),
'contain' => array(
'Club' => array(
'fields' => array(
'id',
'name'
),
'Post' => array(
'fields' => array(
'id',
'title',
'description',
'created',
),
'order' => array('Post.created' => 'DESC'),
'conditions' => array(
'DATEDIFF(NOW(), `Post.created`) <= ClubsUser.max_time_posts',
),
'limit' => 10
)
)
)
));
Он генерирует три следующие запросы SQL (я заменил поле имени, по * для ясности):
SELECT * FROM `users` AS `Follower`
WHERE `Follower`.`id` = 1
LIMIT 1
SELECT * FROM `clubs` AS `Club`
JOIN `clubs_users` AS `ClubsUser`
ON (`ClubsUser`.`user_id` = 1 AND `ClubsUser`.`club_id` = `Club`.`id`)
ORDER BY `ClubsUser`.`role_id` DESC
SELECT * FROM `posts` AS `Post`
WHERE DATEDIFF(NOW(), `Post`.`created`) <= `ClubsUser`.`max_time_posts` AND `Post`.`club_id` = (1)
ORDER BY `Post`.`created` DESC
LIMIT 10
Последнего запрос возвращает ошибка: поле «ClubsUser.max_time_posts» неизвестно в котором пункт
в идеале, я хотел бы получить запрос, близкий к одному ниже вместо двух последних запросов выше:
SELECT * FROM `clubs` AS `Club`
JOIN `clubs_users` AS `ClubsUser`
ON (`ClubsUser`.`user_id` = 1 AND `ClubsUser`.`club_id` = `Club`.`id`)
LEFT JOIN `posts` AS `Post`
ON (`Post`.`club_id` = `Club`.`id` AND DATEDIFF(NOW(), `Post`.`created`) <= `ClubsUser`.`max_time_posts`)
ORDER BY `ClubsUser`.`role_id` DESC, `Post`.`created` DESC
LIMIT 10
Любые идеи?
Что SQL запрос продуцируемые кода? Copypaste из вывода отладки. Какой SQL-запрос нужен? – bancer
@bancer: Я отредактировал мой вопрос –