Более элегантный способ свернуть несколько рядов? - PullRequest
3 голосов
/ 09 марта 2012

Я новичок в codeigniter (хотя я полагаю, что это не исключительно вопрос CI) и у меня есть метод в модели, который выбирает данные из двух таблиц, объединенных идентификатором.

Таблица 1 (tblclients) выглядит следующим образом:

+----+------------+
+ id + c_name     +
+----+------------+
+ 1  + Joe Bloggs +
+ 2  + Jim Bloggs +
+ 3  + Tim Bloggs +
+----+------------+

Таблица 2 (tblstars) выглядит так:

+----+------------+
+ id + s_date     +
+----+------------+
+ 1  + 27/01/12   +
+ 1  + 15/02/12   +
+ 1  + 18/02/12   +
+ 2  + 03/01/12   +
+ 2  + 11/02/12   +
+ 2  + 15/02/12   +
+ 3  + 01/01/12   +
+ 3  + 19/02/12   +
+----+------------+

Я хочу «свернуть» объединенные данные в одну строку для каждой строки в tblclients, чтобы я мог вывести, например:

+----+------------+--------------------------------+
+ id + Name       +   Dates                        +
+----+------------+--------------------------------+
+ 1  + Joe Bloggs + 27/01/12   15/02/12   18/02/12 +
+ 2  + Jim Bloggs + 03/01/12   11/02/12   15/02/12 +
+ 3  + Tim Bloggs + 01/01/12   19/02/12            +
+----+------------+--------------------------------+

Теперь я «решил» проблему, используя в моей модели следующее:

    function get_clients_concat()
{   
    $query = $this->db
    ->select('tblclients.id, tblclients.c_name, GROUP_CONCAT(tblstars.s_date SEPARATOR "#") AS star_dates', NULL, FALSE)
    ->join('tblstars', 'tblstars.id = tblclients.id', 'left')
    ->order_by('tblclients.id')
    ->group_by('tblclients.id')
    ->get('tblclients');
    return $query->result();        

}

, а затем взорвать массив (созданный GROUP_CONCAT), на мой взгляд, и выполнить с ним некоторую обработку ... но, похоже, он действительно CLUNKY.

Есть ли лучшее решение?

1 Ответ

0 голосов
/ 10 марта 2012

Если вы хотите получить все эти данные в одном запросе (с уникальным идентификатором каждой строки), тогда да - это путь.

Если вам нужно отсортировать или отфильтровать результаты, выКогда таблицы заполнятся, возникнут узкие места в производительности.

Это кажется странным - почему бы вместо этого не выбрать tblstars (присоединение tblclients), а затем использовать логику приложения для индексации датc_name / id?

<?php

// Select data from tables
$data = $this->db
    ->select('tblclients.id, tblclients.c_name, tblstars.s_date')
    ->join('tblclients', 'tblclients.id = tblstars.id')
    ->order_by('tblstars.id')
    ->get('tblstars');

// Index data by client id
// (keeping record of client name and dates array for each)
$clients = array();
foreach ($data->result() as $result)
{
    if (empty($clients[$result->id]))
    {
        $clients[$result->id] = array(
            'name'  => $result->c_name,
            'dates' => array($result->s_date)
        );
    }
    else
    {
        $clients[$result->id]['dates'][] = $result->s_date;
    }
}

return $clients;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...