f3 / Fat Free Framework: почему функция выбора SQL-Mapper возвращает все столбцы из таблицы? - PullRequest
0 голосов
/ 04 ноября 2018

Представьте себе таблицу MySQL с двумя столбцами, col1 и col2, которые запрашиваются SQL-Mapper f3 следующим образом:

$rows = $mapper->find();
$rows = $mapper->select('col1');

При использовании find оба столбца запрашиваются и возвращаются, и к ним можно получить доступ следующим образом:

... = $rows[0]->col1;
... = $rows[0]->col2;

При использовании выберите вызов $ lines [0] -> col2 вернет ноль, потому что col2 не был включен в строковый аргумент выберите метод, который подходит.

Теперь при выполнении var_dump я заметил, что метод select возвращает все столбцы! Почему это?

Я предполагал, что целью метода select будет сохранение ресурсов на сервере базы данных путем запроса только указанных столбцов. Так какова цель метода SQL-Mapper: выберите , если он возвращает полный набор столбцов - у нас есть для этого метод find , не так ли?

1 Ответ

0 голосов
/ 06 ноября 2018

Назначение средства отображения без жира SQL состоит в том, чтобы автоматически отображать столбцы таблицы в свойствах объекта PHP. Это делается во время создания экземпляра в DB\SQL\Mapper::__construct.

Поэтому, когда вы вызываете $mapper->find() или $mapper->select(), создание экземпляра уже выполнено, и столбцы таблицы уже сопоставлены с объектом $mapper.

Это объясняет результаты вашей команды var_dump.

Теперь вы можете настроить список отображаемых столбцов, но это необходимо сделать при создании экземпляра:

// map all columns
$mapper = new DB\SQL\Mapper($db,'table_name');

// only map col1 & col2 columns
$mapper = new DB\SQL\Mapper($db,'table_name','col1,col2');

Что касается метода select(), мне интересно, почему этот метод был обнародован. Он используется внутри find(), но сам по себе не очень удобен для использования, учитывая, что все указанные поля должны совпадать с объявленными столбцами при создании экземпляра и что вычисляемые столбцы должны быть как псевдонимами, так и объявлены. См:

$mapper = new DB\SQL\Mapper($db,'table_name','col1,col2');

// ex.1: column not declared
$results = $mapper->select('*');
echo $results[0]->col3; // undefined field col3

// ex.2a: computed column not aliased
$results = $mapper->select('SUM(col1)');
echo $results[0]->{'SUM(col1)'}; // undefined field SUM(col1)

// ex.2b: computed column aliased but not declared
$results = $mapper->select('SUM(col1) AS sum1');
echo $results[0]->sum1; // undefined field sum1

// ex.2c: computed column declared but not aliased
$mapper->sum1 = 'SUM(col1)';
$results = $mapper->select('SUM(col1)');
echo $results[0]->sum1; // empty

// ex.2d: computed column aliased and declared
$mapper->sum1 = 'SUM(col1)';
$results = $mapper->select('SUM(col1) AS sum1');
echo $results[0]->sum1; // OK!

Как видите, использование этого метода очень строго. Я бы не советовал им пользоваться, если вы действительно не знаете, что делаете. Вместо этого используйте find().

...