Я разрабатываю приложение для удовольствия, и я целенаправленно НЕ использую какие-либо фреймворки, кроме усов для 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);
}
Я хочу игнорировать любые поля с пустыми или пустыми значениями, как будто они не существуют, и формировать массив со столбцами в базе данных с несколькими строками данных. Я также понимаю, что использование fetch для отдельных экземпляров, таких как заголовок страницы и fetchAll, будет работать для нескольких строк, однако я хочу устранить это.
Чтобы шаблоны правильно связывались, вывод данных должен выглядеть примерно так:
{
module_name: 'main',
module_title: 'Main',
module_images: ['http://...', 'http://...', 'http://...'],
module_scripts: ['http://...','http://...','http://...',]
}
Вместо этого с fetch все получаю
[{
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 макс., И к таблицам представления, кроме таблиц представления, не будет осуществляться доступ с использованием подстановочного знака. Тем не менее, наряду с динамическими именами col от представления к представлению, ОЧЕНЬ МЕНЬШЕ кода для написания. Я надеюсь, что это никого не оскорбляет 🙂
Спасибо всем за помощь.
Это то, что вы после ??
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)
Перечитав вопрос, я не думаю, что подзапрос необходим, если я что-то упустил?
Других решений пока нет …