xPDO: некорректное определение типа поля в JOIN ON
Пользовательская таблица, имеет xPDO-схему без связей с другими таблицами:
Как видно по схеме, все поля имеют целочисленный тип.
Если пользовательскую таблицу join'ить к «modResource»:
то число 5 парсится как строка:
Если же пользовательскую таблицу join'ить к самой себе:
то число 5 парсится как число (как и должно быть):
Вопрос: почему корректность определения типа поля «sRelations.id» пользовательской таблицы зависит от таблицы, к которой она join'иться?
— Если условие по любому полю присоединяемой пользовательской таблицы записать в WHERE, то наблюдается та же самая картина:
Получаем:
Тип id2 определяется как строковый
<?xml version="1.0" encoding="UTF-8"?>
<model package="s" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1">
<object class="sRelations" table="sRelations" extends="xPDOSimpleObject">
<field key="id1" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" index="index" />
<field key="id2" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" index="index" />
</object>
</model>
Как видно по схеме, все поля имеют целочисленный тип.
Если пользовательскую таблицу join'ить к «modResource»:
$query = $modx->newQuery('modResource');
$query->select(array('modResource.id AS resourceId'));
$query->innerJoin('sRelations', 'sRelations', array('sRelations.id1:=' => 5));
то число 5 парсится как строка:
SELECT modResource.id AS resourceId
FROM `modx_site_content` AS `modResource`
JOIN `sRelations` `sRelations` ON `sRelations`.`id1` = '5'
Если же пользовательскую таблицу join'ить к самой себе:
$query = $modx->newQuery('sRelations');
$query->select(array('sRelations.id1 AS id1'));
$query->innerJoin('sRelations', 'sRelationsNew', array('sRelationsNew.id1:=' => 5));
то число 5 парсится как число (как и должно быть):
SELECT sRelations.id1 AS id1
FROM `sRelations` AS `sRelations`
JOIN `sRelations` `sRelationsNew` ON `sRelationsNew`.`id1` = 5
Вопрос: почему корректность определения типа поля «sRelations.id» пользовательской таблицы зависит от таблицы, к которой она join'иться?
— Если условие по любому полю присоединяемой пользовательской таблицы записать в WHERE, то наблюдается та же самая картина:
$query = $modx->newQuery('modResource');
$query->select(array('modResource.id AS resourceId'));
$query->innerJoin('sRelations', 'sRelations', array('sRelations.id = modResource.id'));
$query->where(array('sRelations.id2:=' => 8));
Получаем:
SELECT modResource.id AS resourceId
FROM `modx_site_content` AS `modResource`
JOIN `sRelations` `sRelations` ON sRelations.id = modResource.id
WHERE `sRelations`.`id2` = '8'
Тип id2 определяется как строковый
Комментарии: 1
$query = $modx->newQuery('modResource');
$query->select(array('modResource.id AS resourceId'));
$query->innerJoin('modTemplateVarTemplate', 'TVValues', array('TVValues.contentid = modResource.id'));
$query->where(array('TVValues.tmplvarid:=' => 8));
Получаем запрос:
SELECT modResource.id AS resourceId
FROM `modx_site_content` AS `modResource`
JOIN `modx_site_tmplvar_templates` `TVValues` ON TVValues.contentid = modResource.id
WHERE `TVValues`.`tmplvarid` = '8'
Это нормально?
Почему-то xPDO не получает мета-информацию о присоединённых таблицах. В итоге все поля присоединённых таблиц он типизирует как строковые.
Получается, что создавать условия по присоединённым полям по стандартам xPDO (ассоциативный массив) нельзя — только на чистом SQL.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.