Как правильно обрабатывать отношение: m с PHP и MySQL? - PullRequest
0 голосов
/ 26 января 2011

у меня есть 3 стола:

+-----------------+
|   validations   |
+----+-------+----+
| id | param | ...
+----+-------+
+------------------+
|   replacements   |
+----+-------------+
| id | replacement |
+----+-------------+
+--------------------------------+
|    validations-replacements    |
+---------------+----------------+
| validation_id | replacement_id |
+---------------+----------------+

Теперь я выполняю свой SQL-запрос к этим таблицам (конечно, с объединениями). И что я получаю в PHP это что-то. вот так:

...
[6] => stdClass Object
(
    [id] => 11
    [search_param] => Dänische Belletristik
    [replacement] => Denmark
)

[7] => stdClass Object
(
    [id] => 11
    [search_param] => Dänische Belletristik
    [replacement] => Fiction
)
...

Теперь в моем PHP-массиве у меня есть несколько одинаковых 'search_param' и 'id'. Это отстой для печати на экране. Я мог бы сгруппировать данные по 'id', чтобы избежать этого, но тогда у меня есть только 1 доступное значение 'замены'.

То, что я ищу, будет результатом, подобным этому:

...
[7] => stdClass Object
(
    [id] => 11
    [search_param] => Dänische Belletristik
    [replacement] => array(Denmark, Fiction)
)
...

Что я хочу знать: возможно ли это с моей структурой таблицы, просто исправив запрос? Или мне нужно позаботиться об этом в моем PHP-коде - если так: есть ли подсказки, как это сделать лучше всего? Там много данных ... Правильна ли структура моей таблицы? Я все еще немного не уверен, когда дело доходит до баз данных ...

С уважением.

Ответы [ 2 ]

1 голос
/ 26 января 2011

Похоже, вы хотите показать все замены для определенного параметра поиска?Предполагая, что ваш запрос выглядит примерно так:

SELECT * 
FROM validations_replacements vr 
INNER JOIN validations v ON v.id = vr.validation_id 
INNER JOIN replacements r ON r.id = vr.replacement_id
WHERE v.param = '$search_param'

Вы можете сгруппировать их в PHP, поиграв с массивом результатов, предполагая, что ваш объект результатов равен $results:

$replacements = array() ;
foreach ($results as $result) {
    $currSearchParam = $result['search_param'];
    $currReplacement = $result['replacement'] ;
    if (!isset($replacements[$currSearchParam])) {
        $replacements[$currSearchParam] = array() ;
    }
    $replacements[$currSearchParam][] = $currReplacement;
}

//I'll let you fill in the blanks like object id or naming the array keys as you wish

ИЛИможно сделать это в MySQL, а затем просто выполнить итерацию по результату в PHP:

SELECT v.id, v.param, GROUP_CONCAT(r.replacement)
FROM validations_replacements vr 
INNER JOIN validations v ON v.id = vr.validation_id 
INNER JOIN replacements r ON r.id = vr.replacement_id
WHERE v.param = '$search_param'
GROUP BY v.id

С GROUP_CONCAT вы получите всю строку результата для каждого параметра поиска и все егозамены в строке через запятую, с которой вы можете легко работать, перебирая результат в PHP:

$replacements = array() ;
foreach ($results as $result) {
    $currSearchParam = $result['search_param'];
    $currReplacements = $result['replacements'] ;
    $replacements[$currSearchParam] = explode(',', $currReplacements) ;
}
0 голосов
/ 26 января 2011

Похоже, вы могли бы использовать GROUP_CONCAT

...