CFWheels: сопоставление таблицы с другой базой данных Database.tablename

У меня есть источник данных под названием «cforms», который имеет доступ к двум базам данных «cforms» и «cquizes».

Я хочу создать следующий запрос:

select * from cquizes.tb_depts;

У меня есть модель таблицы "tb_depts":

<cfcomponent extends="Model">
    <cffunction name="init">
        <cfset table("tb_depts")>
    </cffunction>
</cfcomponent>

И мой контроллер:

list = model("tb_depts").findAll(order="id");

Когда я запускаю этот контроллер/действие. Это дает мне следующую ошибку:

[Macromedia][Oracle JDBC Driver][Oracle]ORA-00942: table or view does not exist

И генерирует следующий запрос:

 SELECT * FROM tb_depts

Я понимаю, в чем проблема, потому что, поскольку «tb_depts» не существует в базе данных «cforms», она выдает ошибку «не найдено». Однако есть способ сообщить модели, что с помощью источника данных «cforms» доступ к базе данных «выполняется». Например

cquizes.tb_depts

Кажется, он использует базу данных, которая соответствует имени источника данных. Есть ли способ обойти эту функцию.


person Saad A    schedule 11.11.2015    source источник
comment
Не могли бы вы создать представление в базе данных1, которое выбирает таблицу в базе данных2, а затем использовать представление в своей модели?   -  person Dan Bracuk    schedule 11.11.2015
comment
не пробовал, попробую, отпишусь по результатам   -  person Saad A    schedule 11.11.2015
comment
Я бы сказал, что это тот случай, когда стоит вернуться к cfquery. Wheels этому не препятствует — нет ничего плохого в том, чтобы обернуть cfquery функцией типа getQuizzes(), чтобы получить то, что вам нужно. controller.cfc может быть хорошим местом для таких функций.   -  person Neokoenig    schedule 11.11.2015
comment
@Dan, кажется, это работает, но другая проблема заключается в том, что в таблице view_tb_depts не существует первичного ключа.   -  person Saad A    schedule 11.11.2015
comment
@Dan, в моем представлении есть sql; ВЫБЕРИТЕ ID,UNIT,DEPT,CLASS ИЗ CQUIZES.TB_DEPTS. Не уверен, что представление должно иметь первичный ключ   -  person Saad A    schedule 11.11.2015
comment
@Dan, таблица TD_DEPTS имеет первичный ключ для идентификатора в своей базе данных.   -  person Saad A    schedule 11.11.2015


Ответы (1)


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

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

<cfcomponent extends="Model">
    <cffunction name="init">
        <cfset dataSource("cquizdatasource")>
        <cfset table("tb_depts")>
    </cffunction>
</cfcomponent>

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

person Tushar Bhaware    schedule 16.11.2015
comment
@SaadA Какую ошибку это выдало? Вы можете опубликовать ошибку, с которой вы столкнулись? - person Tushar Bhaware; 23.11.2015
comment
Пишет, что источник данных недоступен. В итоге я сделал старый добрый cfquery. - person Saad A; 23.11.2015
comment
Самое близкое, что я получил, это использовать ответ @dan, используя представление. но затем он говорит что-то об отсутствии первичного ключа. - person Saad A; 23.11.2015
comment
@SaadA, интересно. Этот подход должен работать. Может еще что-то пойдет не так. Иногда CF выдает запутанную ошибку, а не реальную ошибку. - person Tushar Bhaware; 24.11.2015
comment
Эй, спасибо за попытку помочь. Я понял, что формулировка моего вопроса сбивает с толку, поэтому я отредактировал. Пожалуйста, дайте мне знать, если вы поможете - person Saad A; 28.11.2015