Выбор конкретной присоединенной записи из 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");

Это должно получить все статусы от конкретного пользователя... или вам это нужно для всех пользователей? Я нахожу ваш вопрос немного сложным для решения. Что именно вы пытаетесь вернуть?

Другие вопросы по тегам