создание модели из таблицы mySQL с PDO

Я разрабатываю приложение для удовольствия, и я целенаправленно НЕ использую никаких фреймворков, кроме усов для PHP и JS и т. д., ни на клиентской, ни на серверной стороне скромного приложения.

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

Я НЕ хочу менять методы для доступа к какому-либо конкретному столбцу во время выполнения. fetchAll дает мне массу нулевых полей в возвращаемых данных, которые мне не нужны, в то время как fetch() дает мне красивую структуру JSON, содержащую все правильные данные, кроме столбца, содержащего более одной строки данных, отображаемых только для первой строки /пример.

Вот мой метод PHP:

public function get_view($view_name , $out_type = "raw"){

                // Col names may vary from view table to view table

                $statement = $this->prep_sql("SELECT * FROM `$view_name`");

                $statement->execute(array());

                $view_data = $statement->fetch(); // I know fetchAll will work for arrays but how then will my mustache template bind to data returned from columns with more than one row?

                return (strtoupper($out_type) === "JSON" ? json_encode($view_data) :  $view_data);

            }

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

Вот как выглядит моя таблица ‹code›view_data_main‹/code›:


Чтобы шаблоны правильно связывались, выходные данные должны выглядеть примерно так:

 {
     module_name: 'main', 
     module_title: 'Main', 
     module_images: ['http://...', 'http://...', 'http://...'], 
     module_scripts: ['http://...','http://...','http://...',]
}

Вместо этого я получаю fetchAll

[{
    module_name: 'main',
    module_title: 'Main',
    module_images: 'http://...', // 1
    module_scripts: 'http://...' // 1
  }, {
    module_name: null,
    module_title: null,
    module_images: 'http://..', // 2
    module_scripts: 'http://..' // 2
}];

Я знаю, что SELECT * не является традиционным способом выбора всех ваших данных представления, однако количество столбцов в каждой таблице представления будет меньше 100 максимум, и никакие таблицы, кроме таблиц представлений, не будут доступны с использованием выбора подстановочного знака. Тем не менее, наряду с динамическими именами столбцов от представления до представления, означает НАМНОГО меньше кода для написания. Надеюсь, это никого не обидит :)

Всем сердечно благодарю за помощь.


person Alpha G33k    schedule 07.12.2015    source источник
comment
Надеюсь, я вас правильно понял, но я считаю, что вы хотите использовать функцию GROUP_CONCAT mysql. Однако вам нужно будет установить это в своей функции get_view, но вы специально сказали, что не хотите. Я не уверен, есть ли другой способ сделать это? Вы можете попробовать выполнить подзапрос с GROUP_CONCAT, а затем выбрать поле, только если есть данные?   -  person Ukuser32    schedule 09.12.2015
comment
Да, @Ukuser32 похоже, это может сработать... не могли бы вы предложить решение, я не уверен в реализации. Спасибо   -  person Alpha G33k    schedule 11.12.2015


Ответы (1)


Это то, что вы после ??

CREATE TABLE view_data_main (
    module_name VARCHAR(30),
    module_title VARCHAR(30),
    module_images VARCHAR(30),
    module_scripts VARCHAR(30)
)

INSERT INTO `view_data_main` (module_name,module_title,module_images,module_scripts) VALUES 
('welcome','main','http://www.test.com','http://www.test2.com'),
(NULL,NULL,'http://www.test.com','http://www.test2.com'),
(NULL,NULL,'http://www.test.com','http://www.test2.com')

SELECT module_name,module_title,GROUP_CONCAT(module_images),GROUP_CONCAT(module_scripts)
FROM `view_data_main`
WHERE module_images IS NOT NULL AND module_scripts IS NOT NULL
GROUP BY CONCAT(module_images,',',module_scripts)

Перечитав вопрос, я не думаю, что подзапрос необходим, если я что-то не упустил?

person Ukuser32    schedule 14.12.2015
comment
Я собирался попробовать это сейчас, однако мне нужно использовать select *, потому что имена столбцов могут быть уникальными от таблицы просмотра к таблице просмотра в зависимости от представления, в котором оно находится (возможно, sub_nav_links для одного и cta_content для другого и т. д.) я бы предпочитаю не использовать имена столбцов в моем запросе, так как каждое частичное представление будет иметь максимум 20-30 столбцов, некоторые части с общим пространством имен (например, заголовком), а некоторые, как указано, нет. О, и спасибо за помощь до сих пор! - person Alpha G33k; 15.12.2015
comment
Я не уверен, что это возможно? Я думаю, вам придется сделать кодирование где-то вдоль линий. Вы можете скомпилировать массив с нулевыми значениями, а затем просто очистить его с помощью array_filter() и передать только первый параметр. Таким образом, вам не нужно беспокоиться о нулевых значениях? Если бы вы сохранили все поля в PHP из таблицы (выполните запрос SELECT Columns from table type), это может помочь. - person Ukuser32; 15.12.2015