Можете ли вы включить две модели в один запрос в CakePHP? - PullRequest
1 голос
/ 17 сентября 2010

Я создаю приложение для рецензирования книг.

В модели Review у меня есть book_id и несколько полей, таких как author_rating и / или scary_rating.

В модели Book у меня есть функция search (), которую я хотел бы использовать для поиска книг с определенными характеристиками, например, author_rating выше 5.

Каков наилучший способ сделать это? Я знаю, что это, вероятно, неправильно, но я мог бы добавить атрибуты (author_rating, scary_rating и т. Д.) В модель книги и обновлять их (усреднять их) при каждой отправке обзора; или я мог бы запустить задачу cron, которая обновляет эти поля очень часто.

Но есть ли лучший способ, когда я мог бы запросить модели Book и Review, чтобы найти Books и соответствовать определенным критериям, определенным просмотром базы данных Reviews?

Имеет ли это смысл?

Ответы [ 2 ]

1 голос
/ 17 сентября 2010
you could use union, to combine two queries!!!

query 1......

union

query 2.....

order by ratings LIMIT 1

в таком формате, если вы хотите пример из реальной жизни, тогда я готов дать вам один,

SELECT
               u.username, u.picture,m.id, m.user_note, m.reply_id, m.reply_name, m.dt
              FROM
                relationships r,
                notes m,
                user u
              WHERE
                m.user_id = r.leader
              AND
                r.leader = u.user_id
              AND
                r.listener = '$user_id'
             UNION
               select username, picture,id, user_note, reply_id, reply_name, dt
               from user u, notes b
               where u.user_id = b.user_id
               and
               b.user_id ='$user_id'
               ORDER BY dt DESC LIMIT 10";
0 голосов
/ 18 сентября 2010

Похоже, у вас есть куча отзывов, и вы хотите усреднить их на лету, когда кто-то ищет, это правильно? Если это так, я думаю, что было бы лучше сохранить усредненные оценки как поля в модели Книги.

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

Однако, если вы хотите вычислить эти средние значения на лету, вы можете использовать функцию MySQL AVG (). Посмотрите этот пост, чтобы найти пример, который, на мой взгляд, довольно близок к вашей ситуации:

MySQL - Могу ли я объединить эти 2 оператора SQL? Объединить JOIN и AVG?

Кроме того, это ситуация, когда я, вероятно, просто напишу SQL и вставлю его в query(), а не пытаюсь бороться с синтаксисом ORM в Cake:

http://book.cakephp.org/view/456/query

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