условия для аксессуаров в Coldfusion ORM - PullRequest
2 голосов
/ 10 июня 2011

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

<cfset person=EntityLoad("person", {name="#URL.name#"})>
<cfset pets=person[1].getPets()>

есть ли способ вызвать getPets, где type = 'dog' или что-то еще?

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

1 Ответ

2 голосов
/ 16 июня 2011

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

Один из подходов - добавить метод к Person, который будет возвращать тип Pet. Мы используем нечто подобное в нашем текущем проекте.

array function getDogs() {
    var HQL = "where petType = 'dog'";
    return ormGetSession().createFilter(this.getPets(),HQL).list();
}

Вы также можете сделать его более общим:

array function getPets( required string petType ) {
    var HQL = "where petType = '" & arguments.petType & "'";
    return ormGetSession().createFilter(this.getPets(),HQL).list();
}

Другой подход заключается в использовании атрибута where в отношениях в объекте Person при извлечении домашних животных. Мы также используем что-то вроде этого:

property name="cats" type="array" fieldtype="one-to-many" cfc="model.Pets" fkcolumn="PERSON_ID" where="PET_TYPE = 'cat'" lazy="false";
property name="dogs" type="array" fieldtype="one-to-many" cfc="model.Pets" fkcolumn="PERSON_ID" where="PET_TYPE = 'dog'" lazy="false";

Обратите внимание, что в этих примерах делается несколько предположений о структуре вашего приложения и базы данных: в папке model есть объект Pets, который отображается на таблицу в вашей базе данных; эта таблица имеет столбец PET_TYPE (который сопоставляется со свойством petType), который содержит типы домашних животных в нижнем регистре; объект Person отображается в таблицу с первичным ключом с именем PERSON_ID, который также является внешним ключом в таблице Pets.

Кроме того, при рассмотрении этих и других подходов вы должны подумать о том, как вы собираетесь получать доступ к домашним животным. Отключение отложенной загрузки может привести к снижению производительности, если у вас есть значительное количество домашних животных, особенно если вы хотите сохранить несколько типов (например, вы делаете несколько проходов через таблицу домашних животных при инициализации человека). Вам могут не понадобиться отдельные свойства, если вы не часто заходите в Pets; может быть достаточно просто иметь функцию getPets ().

...