Выбор конкретной присоединенной записи из findAll() с помощью функции hasMany()
(Я попытался опубликовать это в группе Google CFWheels (дважды), но по какой-то причине мое сообщение так и не появилось. Этот список модерируется?)
Вот моя проблема: я работаю над приложением для социальных сетей в CF на колесах, не слишком отличающимся от того, с которым мы все знакомы в удивительных уроках Криса Питерса. Однако в моем случае мне необходимо отобразить самое последнее сообщение о состоянии в пользовательском каталоге. У меня есть модель User с hasMany("статусы") и модель Status с assignTo("пользователь"). Итак, вот код, с которого я начал:
users = model("user").findAll(include="userprofile, statuses");
Это, конечно, возвращает одну запись для каждого сообщения о статусе в таблице статусов. Массовое излишество. Итак, в следующем я пытаюсь:
users = model("user").findAll(include="userprofile, statuses", group="users.id");
Становится ближе, но теперь мы получаем первую запись статуса для каждого пользователя (самый низкий status.id), когда я хочу выбрать самый последний статус. Я думаю, что в прямом SQL я бы сначала использовал подзапрос для изменения порядка статусов, но это не доступно для меня в Wheels ORM. Так есть ли другой простой способ добиться этого, или мне придется перетаскивать огромный результат запроса или объектные состояния в мой CFML, а затем отфильтровывать их во время цикла?
2 ответа
Вы можете получить самый последний статус, используя вычисляемое свойство:
// models/User.cfc
function init() {
property(
name="mostRecentStatusMessage",
sql="SELECT message FROM statuses WHERE userid = users.id ORDER BY createdat DESC LIMIT 1,1"
);
}
Конечно, синтаксис SELECT
утверждение будет зависеть от вашей RDBMS, но это должно начать вас.
Недостатком является то, что вам нужно будет создать вычисляемое свойство для каждого столбца, который вам нужен в вашем запросе.
Другой вариант - создать метод в вашей модели и написать собственный SQL в <cfquery>
теги. Этот способ также вполне оправдан.
Я не знаю вашу точную схему БД, но не должен ли ваш findAll() выглядеть примерно так:
statuses = model("status").findAll(include="userprofile(user)", where="userid = users.id");
Это должно получить все статусы от конкретного пользователя... или вам это нужно для всех пользователей? Я нахожу ваш вопрос немного сложным для решения. Что именно вы пытаетесь вернуть?