#sql-server #cakephp
#sql-server #cakephp
Вопрос:
Я новичок в CakePHP, поэтому, возможно, я упускаю очевидное.
В системе выполняется последняя загрузка с использованием Microsoft SQL Server 2005 в качестве базы данных. Я ценю, что это немного необычно, но, исправив перезапись URL, я не видел никаких других проблем.
Я бы хотел использовать пользовательский finderQuery, но, похоже, я даже не могу заменить значение по умолчанию. В частности, если я использую
var $hasMany = array(
'RecyclateTypeConversion' => array(
'className' => 'RecyclateTypeConversion',
'foreignKey' => 'recyclate_type_id',
'dependent' => false,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'exclusive' => '',
'finderQuery' => 'select RecyclateTypeConversion.* from recyclate_type_conversions AS RecyclateTypeConversion WHERE RecyclateTypeConversion.recyclate_type_id IN ({$__cakeID__$});',
'counterQuery' => ''
),
};
Я вижу эту ошибку
Обратите внимание (8): неопределенный индекс: RecyclateTypeConversion [COREcakelibsmodeldatasourcesdbo_source.php, строка 1099]
Однако вывод SQL debug подтверждает, что сам запрос выполняется нормально и возвращает 4 записи, а просмотр выполняется отлично, когда finderQuery не указан. Я пробовал и для других таблиц hasMany — с точно такой же проблемой.
Я попытался заменить select all на specific field selects, но я все еще вижу тот же результат. Конечно, запрос выглядит корректно в соответствии с руководством — так в чем же проблема (и может ли это быть связано с использованием MSSQL?)
РЕДАКТИРОВАТЬ: Кроме того, поскольку на этот вопрос пока не получено никаких ответов, каков был бы наилучший подход к отладке этого? Я начал поиск по классу отладки cake, но пока без каких-либо результатов, которые меня просветили. Конечно, если возникнет проблема, я отправлю исправление обратно в проект.
Комментарии:
1. Какую версию cake вы используете?
2. Я использую версию 1.3.8, загруженную пару недель назад. Я бы обновился до 1.3.9, но я не вижу ничего, что решало бы проблему в списке исправлений.
Ответ №1:
Вы проверили, что на самом деле существует модель с именем RecyclateTypeConversion
и что она существует с именем файла в соответствии с соглашениями CakePHP? Т.е. существует ли models/recyclate_type_conversion.php
и в этом файле имя модели определено как RecyclateTypeConversion
.
Ошибка, которую вы получаете, похоже, намекает на то, что с этим именем модели что-то не так, поскольку он не может найти связанный индекс.
Комментарии:
1. Я проверил это — и нет, я не сгенерировал модель. Однако, к сожалению, это не решает проблему.
2. Ну, у меня нет SQL Server, чтобы протестировать это для вас, но мое второе предположение заключается в том, что при использовании
finderQuery
Cake возвращаемые данные будут храниться не в обычном формате (being$this->data[Model][field]
), а в другом формате (обычно$this->data[0]
или подобном), так что вот откуда ваша ошибка undefined index. Разве вы не можете сделатьdebug()
с данными, которые вы получаете обратно, непосредственно перед тем, как получите ошибку?
Ответ №2:
Попробуйте удалить псевдоним из select — приведение в части «AS RecyclateTypeConversion» должно справиться с этим за вас. Мне также нравится заключать пользовательские запросы в двойные кавычки. Возможно, я просто параноик, но ошибки синтаксического анализа строк уже досаждали мне раньше.
var $hasMany = array(
'RecyclateTypeConversion' => array(
'className' => 'RecyclateTypeConversion',
'foreignKey' => 'recyclate_type_id',
'dependent' => false,
'finderQuery' => "select * from recyclate_type_conversions AS RecyclateTypeConversion WHERE RecyclateTypeConversion.recyclate_type_id IN ({$__cakeID__$});",
);
Кроме того, я настоятельно рекомендую вам использовать плагин DebugKit и отправить нам обратно журнал запросов и отладочный вывод результатов поиска, которые вызывают ошибки.
Ответ №3:
вы проходили это шаг за шагом?
- попробуйте получить все (all data)
- попробуйте выполнить условия
- попробуйте «сдерживаемое» поведение для создания вашего запроса, что, на мой взгляд, намного упрощает задачу
Комментарии:
1. Конечно, пытался удалить его обратно — тот же результат. Я новичок в cake, хотя — что вы подразумеваете под содержимым запросом? Я был бы открыт для другого способа сделать это.
2. «containable» — это поведение, которое вы можете использовать. вам нужно добавить в $ ActAs, затем вы не можете добавлять модели в свой запрос поиска следующим образом: ‘contain’ => array(‘имямодели’), и cake добавит данные
Ответ №4:
Вы пробовали отладочный комплект CakePHP