Nano Hash - криптовалюты, майнинг, программирование

Выбор конкретной объединенной записи из findAll() с включением hasMany()

(Я пытался опубликовать это в группе Google CFWheels (дважды), но по какой-то причине мое сообщение никогда не появляется. Этот список модерируется?)

Вот моя проблема: я работаю над приложением для социальных сетей в CF on Wheels, не слишком отличающимся от того, с которым мы все знакомы по замечательным урокам Криса Питерса. Однако в моем случае мне нужно отображать самое последнее сообщение о состоянии в пользовательском каталоге. У меня есть модель пользователя с hasMany("статусы") и модель состояния с containsTo("пользователь"). Итак, вот код, с которого я начал:

users = model("user").findAll(include="userprofile, statuses");

Это, конечно, возвращает одну запись для каждого сообщения о состоянии в таблице состояний. Массовый перебор. Итак, затем я пытаюсь:

users = model("user").findAll(include="userprofile, statuses", group="users.id");

Приближаемся, но теперь мы получаем первую запись статуса для каждого пользователя (самый низкий статус.id), когда я хочу выбрать самый последний статус. Я думаю, что в прямом SQL я бы использовал подзапрос, чтобы сначала изменить порядок статусов, но это недоступно для меня в Wheels ORM. Итак, есть ли другой чистый способ добиться этого, или мне придется перетаскивать огромный результат запроса или возражать против статусов в моем CFML, а затем отфильтровывать их, пока я зацикливаюсь?

05.07.2012

Ответы:


1

Вы можете получить самый последний статус, используя вычисляемое свойство:

// 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 будет зависеть от вашей СУБД, но это должно вам помочь.

Недостатком является то, что вам нужно будет создать вычисляемое свойство для каждого столбца, который вам нужен в вашем запросе.

Другой вариант — создать метод в вашей модели и написать собственный SQL в тегах <cfquery>. Такой способ также вполне допустим.

05.07.2012
  • Привет, Крис. Большое спасибо за ответ (и за то, что в целом сделали CFW доступным для всех нас!). Решение property() — хорошее начало (это бросалось мне в глаза), но, как написано, оно просто получает самый последний статус, когда-либо, один раз. Мне нужен самый последний статус для каждого пользователя, где это применимо (у некоторых вообще нет статусов). 05.07.2012
  • Извини за это. Работает ли мое редактирование, когда я добавляю предложение WHERE в подзапрос? 05.07.2012
  • Ну, я пробовал это перед моим последним ответом, но все, что он делает, это получает сообщение для первой записи. У меня есть 4 тестовых пользователя с записями в пользователях и профилях пользователей. У двух из них опубликован хотя бы один статус; у двух других нет. Статус захватывается только для user.id = 1, поэтому, предположительно, проверяется первый. После этого я получаю значение, возвращаемое для всех трех статусов других пользователей. 05.07.2012
  • Попробуйте сбросить полученный запрос и посмотреть, какой SQL он выполняет. Теоретически мой код должен работать. 05.07.2012

  • 2

    Я не знаю вашей точной схемы БД, но разве ваш findAll() не должен выглядеть примерно так:

    statuses = model("status").findAll(include="userprofile(user)", where="userid = users.id");
    

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

    04.08.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..