Вы можете создать объект для сопоставления каждого типа с соответствующим компонентом. Примерно так будет работать:
const LayerVillage = ({ position, name }) => (
<Marker position={position} icon={locationIcon}>
<TooltipComponent permanent direction="bottom" opacity={0.6}>
{name}
</TooltipComponent>
</Marker>
);
const layerComponentsByType = {
village: LayerVillage,
town: LayerTown
};
const stuff = data.map(location => {
const LayerControl = layerComponentsByType[location.type];
return (
<LayerControl
key={location.id}
position={[location.lat, location.lng]}
name={location.name}
/>
);
});
Другая возможность заключается в следующем:
<LayerControl
key={location.id}
{...location}
/>
Таким образом, вы получите пары ключ-значение объекта местоположения в качестве свойств.
Кроме того, у вас может быть компонент по умолчанию, поскольку location.type не может быть свойством layerComponentsByType:
const LayerControl = layerComponentsByType[location.type] || DefaultLayerControl;
Вопрос упоминает MySQL, и на самом деле этот DBMS имеет специальную функцию для этого вида проблемы: GROUP_CONCAT(expr)
. Смотрите в справочник MySQL на группе функциями . Функция была добавлена в версии 4.1 MySQL. Вы будете использовать GROUP BY FileID
в запросе.
я не действительно уверен в том, как Вы хотите, чтобы результат посмотрел. Если Вы захотите каждый атрибут, перечисленный для каждого объекта (даже если не установил), это будет более твердо. Однако это - мое предложение для того, как сделать это:
SELECT bt.FileID, Title, Author,
GROUP_CONCAT(
CONCAT_WS(':', at.AttributeName, at.AttributeType, avt.AttributeValue)
ORDER BY at.AttributeName SEPARATOR ', ')
FROM BaseTable bt JOIN AttributeValueTable avt ON avt.FileID=bt.FileID
JOIN AttributeTable at ON avt.AttributeId=at.AttributeId
GROUP BY bt.FileID;
Это дает Вам всем атрибуты в том же порядке, который мог быть полезным. Вывод будет похож на следующее:
'F001', 'Dox', 'vinay', 'CustomAttr1:varchar(40):Akash, CustomUseDate:Datetime:2009/03/02'
Этот способ, которым Вам только нужны один единственный запрос DB и вывод, легко проанализировать. Если бы Вы хотите сохранить атрибуты как реальную Дату и время и т.д. в DB, необходимо было бы использовать динамический SQL, но я избегу от этого и сохраню значения в varchars.
Общая форма такого запроса была бы
SELECT file.*,
attr1.value AS 'Attribute 1 Name',
attr2.value AS 'Attribute 2 Name',
...
FROM
file
LEFT JOIN attr AS attr1
ON(file.FileId=attr1.FileId and attr1.AttributeId=1)
LEFT JOIN attr AS attr2
ON(file.FileId=attr2.FileId and attr2.AttributeId=2)
...
, Таким образом, необходимо динамично создать запрос из атрибутов, в которых Вы нуждаетесь. В псевдокоде php-выхода
$cols="file";
$joins="";
$rows=$db->GetAll("select * from Attributes");
foreach($rows as $idx=>$row)
{
$alias="attr{$idx}";
$cols.=", {$alias}.value as '".mysql_escape_string($row['AttributeName'])."'";
$joins.="LEFT JOIN attr as {$alias} on ".
"(file.FileId={$alias}.FileId and ".
"{$alias}.AttributeId={$row['AttributeId']}) ";
}
$pivotsql="select $cols from file $joins";
Это - стандарт "строки к столбцам" проблема в SQL.
Это наиболее легко сделано вне SQL.
В Вашем приложении, сделайте следующее:
Определяют простой класс для содержания файла, системных атрибутов и Набора пользовательских атрибутов. Список является хорошим выбором для этого набора потребительских атрибутов. Давайте назовем этот класс FileDescription.
Выполняют простое соединение между файлом и всеми потребительскими атрибутами для файла.
Запись цикл для сборки FileDescriptions от результата запроса.
Выборка первая строка, создайте FileDescription и установите первый потребительский атрибут.
, В то время как существует больше строк для выборки:
Однако существуют решения использовать строки в качестве столбцов, иначе транспонировать данные. Это включает приемы запроса, чтобы сделать это в чистом SQL, или необходимо будет полагаться на определенные функции только avaible в определенной базе данных, с помощью Сводных таблиц (или Кросс-таблицы).
Как exemple Вы видите, как сделать это здесь в Oracle (11 г).
версия программирования будет simplier, чтобы поддержать и сделать и кроме того будет работать с любой базой данных.
Частичный ответ, так как я не знаю MySQL (хорошо). В MSSQL я посмотрел бы на Сводные таблицы или составлю временную таблицу в хранимой процедуре. Это может быть трудное время...