php выдвигает результаты в массив, получая из таблицы

У меня есть такие таблицы

listing_id
1
4
345
654

listing documents

listing_id      folder                  filename
000345        full_menu_file            testfile098
000345        header_menu_file          testfile067
000004        full_menu_file            testfile
000001        menu_file                 testfile567
000004        footer_menu_file          testfile76
000004        test_menu_file            testfile65
000345        footer_menu_file          testfile764
000654        footer_menu_file          testfile098
000654        footer_menu_file          testfile078

Теперь я хочу сделать массив и поместить эти связанные данные в этот массив. Таким образом, окончательный результат будет таким

array(
[1] => Array
(
[listing_id] => 1
[full_menu_file] =>
[header_menu_file] =>
[menu_file] =>
[footer_menu_file] =>
[test_menu_file] =>

)
[1] => Array
(
[listing_id] => 345
[full_menu_file] => testfile067
[header_menu_file] => testfile067
[menu_file] =>
[footer_menu_file] => testfile764
[test_menu_file] =>

)

[2] => Array
(
[listing_id] => 4
[full_menu_file] => testfile
[header_menu_file] =>
[menu_file] =>
[footer_menu_file] => testfile76
[test_menu_file] => testfile65

)
)

Так что я сделал свой PHP-код, как это

$servername = "localhost";
$username = "root";
$password = "root";
$dbname = "listings";
$mysqli = new mysqli($servername, $username, $password, $dbname);

if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

$listing_query = "SELECT * FROM `listings` ORDER BY `listing_id` ASC ";
$cat_array = array();
if( $result = $mysqli->query($listing_query) ) {
while( $obj = $result->fetch_object() ) {
$listing_id = $obj->listing_id;

//Get all the file names
$get_images_name = "SELECT * FROM `listing_documents` WHERE `listing_id` = ".str_pad($listing_id, 6, '0', STR_PAD_LEFT)." ";
if( $img_query = $mysqli->query($get_images_name) ) {
while( $object = $img_query->fetch_object() ) {
if( $object->folder == 'full_menu_file' ) {
$full_menu_file_name = $object->filename;
}
if( $object->folder == 'header_menu_file' ) {
$header_menu_file_name = $object->filename;
}
if( $object->folder == 'menu_file' ) {
$menu_file_name = $object->filename;
}
if( $object->folder == 'footer_menu_file' ) {
$footer_menu_file_name = $object->filename;
}
}

$listing_array['listing_id'] = $listing_id;
$listing_array['full_menu_file_name'] = $object->full_menu_file_name;
$listing_array['header_menu_file'] = $object->header_menu_file;
$listing_array['menu_file'] = $object->menu_file;
$listing_array['footer_menu_file'] = $object->footer_menu_file;

array_push($cat_array, $listing_array);

}
}
print_r($cat_array);

Но это не показывает результат, как мне нужно. Так может кто-нибудь сказать мне, как это сделать? Любые предложения будут действительно заметны. Спасибо

0

Решение

Вы должны поставить кавычки вокруг результата str_pad поэтому он будет рассматриваться как строка, а не число с начальными нулями.

$get_images_name = "SELECT * FROM `listing_documents` WHERE `listing_id` = '".str_pad($listing_id, 6, '0', STR_PAD_LEFT)."' ";

Вы также можете объединить оба запроса в один JOIN:

SELECT l.listing_id as l_listing_id, ld.*
FROM listings as l
JOIN listing_documents AS ld ON ld.listing_id = LPAD(l.listing_id, 6, '0')
ORDER BY l_listing_id

Эквивалентный запрос без объединения:

SELECT *
FROM listing_documents
WHERE listing_id IN (SELECT LPAD(listing_id, 6, 0) FROM listings)
ORDER BY listing_id
1

Другие решения

Я думаю, что ваша проблема в str_pad. Вместо этого вы можете использовать CONVERT или CAST:

SELECT * FROM `listing_documents` WHERE CAST(listing_id AS INT) = $listing_id

SELECT * FROM `listing_documents` WHERE CONVERT(INT, listing_id) = $listing_id
0

Ваша схема не имеет смысла для меня. Я не знаю, почему вы бы использовали дополненную строку вместо целого числа в вашем listing_documents Таблица. Но, используя вашу текущую схему, вы можете сделать:

$result = $mysqli->query(
<<<'QS'
SELECT listings.listing_id, listing_documents.folder, listing_documents.filename
FROM listings
JOIN listing_documents
ON listing_documents.listing_id LIKE LPAD(CONVERT(listings.listing_id,char),6,'0')
ORDER BY listings.listing_id ASC
QS;

Я на самом деле не уверен, если вам нужно конвертировать list_id для lpad. И это, вероятно, более производительным для преобразования listing_documents.listing_id к INT, как ON CONVERT(listing_documents.listing_id,UNSIGNED INTEGER) = listings.listing_id
Затем, чтобы добавить свои результаты в массив:

$outputData = array();
while ($object=$result->fetch_object()){
if (!isset($outputData[$object->listing_id]))
$outputData[$object->listing_id] = array();
$outputData[$object->listing_id][$object->folder] = $object->filename;
}

При таком подходе, если конкретный listing_id в listing_documents не все разные folders, тогда ключ будет пропущен.

Сейчас, $outputData будет иметь данные с ключами массива, являющимися идентификаторами листинга.

Чтобы сбросить ключи массива, вы можете сделать:

$outputData = array_values($outputData);
0
По вопросам рекламы [email protected]