2012-01-12 4 views
3

У меня проблема с условиями поиска 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 

Любые идеи?

+0

Что SQL запрос продуцируемые кода? Copypaste из вывода отладки. Какой SQL-запрос нужен? – bancer

+0

@bancer: Я отредактировал мой вопрос –

ответ

2

Вы не должны использовать HABTM, если у вас есть дополнительные поля в таблице соединений, потому что Cake фактически удаляет и воссоздает эти объединения. Вы должны использовать «hasMany через» ассоциации:

Club hasMany ClubUser 
User hasMany ClubUser 
ClubUser belongsTo Club 
ClubUser belongsTo User 

Когда вы делаете вашу находку User, просто содержат ClubUser затем содержат Club.

$this->User->find('all', array(
    'contain' => array(
     'ClubUser' => array(
      'fields' => array(
       'diff', 
       'limit'), 
      'Club')))); 

Подробнее здесь:

http://book.cakephp.org/1.3/view/1650/hasMany-through-The-Join-Model

и здесь:

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasmany-through

+0

Я пробовал с hasMany через ассоциацию, но он возвратил ту же ошибку. –

+0

Кстати, я не хочу выбирать поля diff и limit (я знаю, как это сделать), я хочу использовать их в условиях и ограничении –

+0

Я не думаю, что можно ссылаться на значение поле, возвращаемое запросом в качестве предельного значения в том же запросе. Я бы просто использовал значения 'diff' и' limit' в представлении, чтобы определить, какие сообщения будут отображаться. – bjudson

Смежные вопросы