Я работаю над сайтом CMS на основе Joomla, и в настоящее время у меня возникают проблемы с выяснением того, как сопоставить значения моей базы данных. Вчера я опубликовал этот вопрос, но удалил его, потому что думал, что проблема решена, и вопрос был плохо структурирован. Надеюсь, я смогу лучше сформулировать то, что я пытаюсь выполнить. Я готов опубликовать это на сайте dev для проверки, если это необходимо (при условии, что это разрешено здесь).
С учетом сказанного я запрашиваю четыре таблицы. Эти четыре таблицы представляют собой элементы, вложения, теги, а затем другую таблицу, которая связывает идентификатор тега с соответствующими идентификаторами элементов.
Вы можете увидеть эти запросы ниже:
// Get all Items associated with this category page
// ID of current category
$current_cat = $this->category->id;
// Product IDs array
$product_ids_array = array();
// Product Names Array
$item_names_array = array();
// Product Descriptions Array
$item_descriptions_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'title', 'introtext', 'id' )));
$query->from( $db->quoteName( '#__k2_items' ) );
$query->where( $db->quoteName( 'catid' )." = " .$current_cat );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Store Titles, Descriptions and IDs in arrays
foreach ($row as $value)
{
$item_names_array[] = $value->title;
$item_descriptions_array[] = $value->introtext;
$product_ids_array[] = $value->id;
};
// Now we're going to get the IDs of the tags associated with the items
// Create comma seperated list of product ids
$product_ids = implode(',', $product_ids_array);
// Tag IDs Array
$tag_IDs_array = array();
$tag_itemIDs_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'tagID', 'itemID' )));
$query->from( $db->quoteName( '#__k2_tags_xref' ) );
$query->where($db->quoteName('itemID') . ' IN (' . $product_ids . ' )' );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Store tag IDs and item IDs
foreach ($row as $value)
{
$tag_IDs_array[] = $value->tagID;
$tag_itemIDs_array[] = $value->itemID;
};
// Now we're going to get the names of the tags
// Create comma seperated list of tag ids
$tag_IDs = implode(',', $tag_IDs_array );
// Tag Names Array
$tag_names_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'name' )));
$query->from( $db->quoteName( '#__k2_tags' ) );
$query->where($db->quoteName('id') . ' IN (' . $tag_IDs . ' )' );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Store tag names
foreach ($row as $value)
{
$tag_names_array[] = $value->name;
};
// Now we're going to get the attachments
// Attachments Arrays
$attachment_itemID_array = array();
$attachment_id_array = array();
$attachment_filename_array = array();
$attachment_title_array = array();
$attachment_title_attr_array = array();
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'id', 'itemID', 'filename', 'title', 'titleAttribute' )));
$query->from( $db->quoteName( '#__k2_attachments' ) );
$query->where($db->quoteName('itemID') . ' IN (' . $product_ids . ' )' );
$db->setQuery( $query );
$row = $db->loadObjectList();
// Store tag names
foreach ($row as $value)
{
$attachment_itemID_array[] = $value->itemID;
$attachment_id_array[] = $value->id;
$attachment_filename_array[] = $value->filename;
$attachment_title_array[] = $value->title;
$attachment_title_attr_array[] = $value->titleAttribute;
};
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'title', 'introtext', 'id' )));
$query->from( $db->quoteName( '#__k2_items' ) );
$query->where($db->quoteName('alias') . ' LIKE '. $db->quote('acid-%') . ' AND ' . $db->quoteName('catid'). ' = ' . $current_cat . ' AND published = 1' );
$db->setQuery( $query );
$row = $db->loadObjectList();
foreach ($row as $value) {
$a = 0;
$a++;
echo $value->title . '<br/>';
echo $value->introtext . '<br/>';
echo $value->id . '<br/>';
}
Как вы можете видеть, последний блок кода - это окончательный запрос к базе данных, в которой я делаю SQL Select с помощью подстановочного выражения. Я хочу, чтобы это было динамично.
Идея сделать ее динамичной - это то, что элементы имеют теги, которые соответствуют префиксу имени. Например, у меня есть тег под названием "Ингибиторы коррозии кислоты", и у меня есть продукт, у которого есть псевдоним "ингибиторы кислотной коррозии-aci-136". Алиас - это то, что я могу извлечь из БД.
В любом случае проблема не в получении данных. Проблема в том, что у меня есть данные, как и черт возьми, я могу разумно объединить данные? Как вы можете видеть из моих запросов в каждом экземпляре, я вытаскиваю ItemID, поэтому мне есть что сравнивать, но с этого момента я теряюсь.
Я по существу пытаюсь сопоставить элементы со связанным тегом (каждый элемент будет иметь только один соответствующий тег), а также связанное с ним вложение.
Надеюсь, это ясно, если я не вернусь, чтобы уточнить и ответить на любые вопросы. Любая помощь будет высоко оценена.
Спасибо.
Обновление # 1
Мне интересно, стоит ли начинать in_array(). По крайней мере, я могу проверить, существует ли ItemID. Что-то вроде этого:
if( in_array( $value->id, $attachment_itemID_array ) ) {
echo 'match';
}
Я не уверен, что это пуленепробиваемый способ убедиться, что правильное вложение связано с правильным элементом и т.д. и т.д. Я бы предположил, что это не так, но, надеюсь, это начало.
Обновление # 2
Начиная думать, мне было бы лучше (в некоторых случаях) просто иметь ассоциативный массив при возврате значений для запроса. Я думаю, что будет легче убедиться, что все правильно согласовано.
Обновление # 3
Надеюсь, что кто-то найдет это полезным. Я пытаюсь получить доступ к этому монстру:
Array ( [0] => stdClass Object ( [id] => 2 [itemID] => 5 [filename] => Flotek-logo_1.png [title] => Flotek-logo_1.png [titleAttribute] => Flotek-logo_1.png ) [1] => stdClass Object ( [id] => 3 [itemID] => 6 [filename] => Logo_Court_Guru_Gray.png [title] => Logo_Court_Guru_Gray.png [titleAttribute] => Logo_Court_Guru_Gray.png ) [2] => stdClass Object ( [id] => 5 [itemID] => 4 [filename] => Icon_Search.png [title] => Icon_Search.png [titleAttribute] => Icon_Search.png ) )
Поэтому я могу использовать его для проверки того, что текущий идентификатор элемента совпадает с ItemID в массиве, но я получаю ошибку индекса undefined при использовании чего-то в строках $array ['itemID']; ясно, что я приближаюсь к этому неправильно. Надеясь найти ответы, я нашел несколько, но не тот, который имеет смысл или в некоторых случаях совершенно разные сценарии.
Хорошо, выглядит так:
$attachmentRow[1]->itemID
Является ответом. Теперь мне интересно, есть ли лучший способ доступа к нему, потому что у меня не будет никакого способа узнать индекс объекта. Я бы предпочел просто прочесывать каждый объект в ассоциативном массиве, по крайней мере.
Обновление # 4
Понял, как просто несколько массивов с помощью json_decode
$attachmentResult = json_decode(json_encode($attachmentRow),true);
В результате получается
Array ( [0] => Array ( [id] => 2 [itemID] => 5 [filename] => Flotek-logo_1.png [title] => Flotek-logo_1.png [titleAttribute] => Flotek-logo_1.png ) [1] => Array ( [id] => 3 [itemID] => 6 [filename] => Logo_Court_Guru_Gray.png [title] => Logo_Court_Guru_Gray.png [titleAttribute] => Logo_Court_Guru_Gray.png ) [2] => Array ( [id] => 5 [itemID] => 4 [filename] => Icon_Search.png [title] => Icon_Search.png [titleAttribute] => Icon_Search.png ) )
Все еще получая индексированную ошибку undefined при использовании чего-то длинного строк
echo $attachmentResult['itemID'];
По-прежнему пытаюсь обернуть голову правильным доступом к ассоциативному массиву.
Ничего. Это правильный путь.
echo $attachmentResult[0]['itemID'];
ОБНОВЛЕНИЕ # 5
Хорошо, я думаю, что я только что получил его. Я нашел очень полезное решение, которое можно найти здесь: Как выполнить поиск по ключевому = > значение в многомерном массиве в PHP - очень удобно для поиска многомерных массивов
Обновленный запрос для прокрутки элементов/продуктов
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'title', 'introtext', 'id' )));
$query->from( $db->quoteName( '#__k2_items' ) );
$query->where($db->quoteName('alias') . ' LIKE '. $db->quote('acid-%') . ' AND ' . $db->quoteName('catid'). ' = ' . $current_cat . ' AND published = 1' );
$db->setQuery( $query );
$row = $db->loadObjectList();
foreach ($row as $value) {
$itemID = $value->id;
$search_result = (search($attachmentResult, 'itemID', $itemID));
if($search_result) {
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select($db->quoteName(array( 'filename' )));
$query->from( $db->quoteName( '#__k2_attachments' ) );
$query->where( $db->quoteName( 'itemID' )." = " .$itemID );
$db->setQuery( $query );
$attachmentRow = $db->loadObjectList();
foreach ($attachmentRow as $attachmentValue) {
echo $attachmentValue->filename;
}
}
echo $value->introtext . '<br/>';
}