CI: Запросить две таблицы в модели, взорваться
-
29-09-2019 - |
Вопрос
Я думаю об этом в течение нескольких дней, и не приезжайте в Grasps (так как я Relativley New для MVC и CI). Я даже не уверен, это проблема с MVC, MySQL или массивами.
Ситуация: 2 Таблицы MySQL
- Таблица данные: ID, название, список
- Таблица ценности: ID, имя
Запрос данные Таблица приводит к массиву, как следующее (выдержка):
[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 ())
- Верните значения имени идентификаторов, если
включите это как-то в основной набор результатов (например, в качестве двумерного массива):
5] => Массив ([ID] => 4 [Название] => Строка [Список] => Array ([0] => значение6 [1] => значение12 ...))
Мой наивный подход до сих пор был
- Запустите запрос на каждой из 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 (с таким или что-то еще).
Любой намек, даже простая ссылка на информационный бит, высоко ценится.
Спасибо триллион!
потрясающий
Решение
Существует отношение многих ко многим между списками и значениями списка. Обычный способ моделирования этого в реляционной базе данных - создать соединительный стол. Итак, я бы структурировал свою схему, как это.
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();
}