Работает ли CakePHP finderQuery с SQL Server? Где бы мне это отладить?

#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:

вы проходили это шаг за шагом?

  1. попробуйте получить все (all data)
  2. попробуйте выполнить условия
  3. попробуйте «сдерживаемое» поведение для создания вашего запроса, что, на мой взгляд, намного упрощает задачу

Комментарии:

1. Конечно, пытался удалить его обратно — тот же результат. Я новичок в cake, хотя — что вы подразумеваете под содержимым запросом? Я был бы открыт для другого способа сделать это.

2. «containable» — это поведение, которое вы можете использовать. вам нужно добавить в $ ActAs, затем вы не можете добавлять модели в свой запрос поиска следующим образом: ‘contain’ => array(‘имямодели’), и cake добавит данные

Ответ №4: