CI: запрашивая две таблицы в модели, взорваться - PullRequest
0 голосов
/ 01 декабря 2010

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

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

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

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

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

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

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

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

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

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

    [5] => Массив ( [id] => 4 [title] => Бар [list] => Array ( [0] => значение6 [1] => значение12 ... ) )

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

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

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

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 Ответ

1 голос
/ 01 декабря 2010

Существует связь «многие ко многим» между списками и значениями списков.Обычным способом моделирования этого в реляционной базе данных является создание объединяющей таблицы.Так что я бы структурировал вашу схему следующим образом.

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();
}
...