SQL объединяет результаты в объект в codeigniter - PullRequest
6 голосов
/ 06 февраля 2012

хорошо, немного фона,

  • только в codeigniter
  • не фанат sql и серверных скриптов
  • я знаю, что такое соединения
  • у меня впервые есть база данных многие ко многим

это потому, что соединения обычно имеют следующий пример. но я хотел разобрать это без необходимости создавать код, чтобы игнорировать повторы. это пример соединения из трех таблиц. проблема повторяющихся значений возрастает, когда я присоединяюсь к большему количеству таблиц:

table1.authorid    table1.authorname    table2.books     table3.favorited
       1                 john           john's book 1        jean
       1                 john           john's book 1        joe
       1                 john           john's book 2        ken
       1                 john           john's book 2        mark
       2                 mark           mark's book 1        alice
       2                 mark           mark's book 1        ted
       2                 mark           mark's book 2        sarah
       2                 mark           mark's book 2        denise

есть ли способ в codeigniter (или простом PHP), чтобы я мог получить эту форму массива и превратить ее в нечто вроде json (и разобрать его как json)

$result = [
    {
        'authorid':1,
        'authorname':'john',
        'books':['john's book1','john's book2'],
        'favorited':['jean','joe','ken','mark']
    },
    {
        'authorid':2,
        'authorname':'mark',
        'books':['mark's book1','mark's book2'],
        'favorited':['alice','ted','sarah','denise']
    }
]

Обновление : это не ограничено этой глубиной объектов / массивов (как в примере). это может идти глубже (массивы в массивах, массивы в объектах, объекты в массивах, объекты в объектах)

1 Ответ

8 голосов
/ 06 февраля 2012
// first, we need the SQL results in the $result_array variable
$sql = 'SELECT ...';  // your SQL command
$result_array = $this->db->query($sql)->result_array();  // codeigniter code

// here the real answer begins
$result = array();

foreach ($result_array as $row)
{
    if (!isset($result[$row['authorid']])
    {
        $author = new StdClass();
        $author->authorid = $row['authorid'];
        $author->authorname = $row['authorname'];
        $author->books = array($row['books']);
        $author->favorited = array($row['favorited']);
        $result[$row['authorid']] = $author;
    }
    else
    {
        if (!in_array($row['books'], $result[$row['authorid']]->books))
        {
            $result[$row['authorid']]->books[] = $row['books'];
        }
        if (!in_array($row['favorited'], $result[$row['authorid']]->favorited))
        {
            $result[$row['authorid']]->favorited[] = $row['favorited'];
        }
    }
}

$result = array_values($result);
echo json_encode($result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...