0

Я думаю об этом в течение нескольких дней и не прихожу к схватам (так как я релятивирую новичок в MVC и CI). Я даже не уверен, что это проблема с MVC, MySQL или массивами.CI: запрос двух таблиц в модели, взорваться

Ситуация: 2 MySQL таблицы

  1. Таблица данные: идентификатор, название, список
  2. Таблица значения: идентификатор, имя

запросов к данных таблицы приводит к массиву, подобному следующему (выдержка):

[4] => Array 
     (
      [id] => 3 
      [title] => Foo     
      [list] => 1,2,3,4,6,14 
     ) 

[5] => Array 
     (
      [id] => 4 
      [title] => Bar     
      [list] => 2,6,9,12 
     ) 

Поле список содержит разделенные запятыми значения, которые соответствуют некоторым идентификаторами значений таблица как

[3] => Array 
      (
       [id] => 12 
       [name] => 'value12'     
      ) 

То, что я пытаюсь сделать для каждой строки:

  • возьмите лист -значения & взорвать его в массив
  • проверки с результирующим набором из значений -стол (через in_array метод())
  • возврата значение Названия идентификаторов, если
  • включить его каким-то образом в основных результирующем наборе (например, в виде 2-мерного массива):

    [5] => Array ( [ID] => 4 [название] => Бар [список] => Array ( [0] => value6 [ 1] => value12 ... ) )

Мой наивный подход до сих пор был

  • выполнения запроса на каждом из 2 столы
  • сравнить наборы 2 результата с помощью in_array

Моей главной проблемы (при попытке строго отдельная модель, контроллер и вид): Как я могу включить имя поле из значений стола в «главном цикле "из данные стол результат набор?

if($q->num_rows() > 0) 
{ 
    $data[] = $q->result_array(); 
    foreach ($q->result() as $row) 
    { 
     $data[] = $row; 
    } 
    return $data; 
} 

Если я использую следующий (громоздкий) подход я, естественно, получить новый пункт каждый раз:

foreach ($q->result_array() as $row) 
{ 
    $data[]['id'] = $row['id']; 
    $data[]['title'] = $row['title']; 
    $data[]['list'] = $row['year']; 
} 

Поскольку это база данных MySQL я не вижу способа сделать то взрывается и сравнения в SQL (с LIKE или что-то еще).

Любые подсказки, даже простая ссылка на информационный бит, высоко ценятся.

Спасибо, триллион!

ФАБ

ответ

1

Существует много-ко-многим между списками и значениями списка. Обычным способом моделирования этого в реляционной базе данных является создание таблицы соединения. Поэтому я бы структурировал вашу схему так.

lists : list_id, title 
values : value_id, name 
list_values : list_id, value_id 

list_values является соединительным столом. Он связывает списки со значениями.

Для создания списка вы можете иметь следующие функции в модели

function build_list($list_id) 
{ 
    $list = $this->get_list($list_id); 
    $list->values = $this->get_list_values($list_id); 
    return $list; 
} 

function get_list($list_id) 
{ 
    $sql = 'select * from lists where list_id=?'; 
    return $this->db->query($sql, array($list_id))->row(); 
} 

function get_list_values($list_id) 
{ 
    $sql = 'select v.value_id, v.name 
     from list_values lv 
     join values v on v.value_id=lv.value_id 
     where lv.list_id=?'; 
    return $this->db->query($sql, array($list_id))->result(); 
} 
+0

Абсолютно. Каждый раз, когда вы думаете о сохранении списка идентификаторов, разделенных запятыми, в столбце таблицы, это сильный сигнал, что вы, вероятно, делаете что-то неправильно. – 2010-12-01 13:43:30