Торт PHP 3 - исключить поля по умолчанию в запросе, если они не выбраны специально - PullRequest
0 голосов
/ 02 марта 2020

Название в значительной степени говорит обо всем. У меня есть несколько таблиц с полями, которые содержат много данных. Чтобы сохранить производительность, я бы не хотел выбирать их по умолчанию.
Акцент на новом поведении по умолчанию, отличающий вопрос от, например, Выбрать все, кроме одного поля в торте php 3 запроса

Пример:

$cities = $this->Cities->find();

// A $city does not include the field `shape` (which is a huge polygon)
$cities = $this->Cities->find(['id', 'name', 'shape']);

// A $city now does include the `shape` property

Я посмотрел на свойства accessible и hidden объекта, но, похоже, они не влияют на оператор SELECT.

РЕДАКТИРОВАТЬ: selectAllExcept запрос кажется полезным. Я объединил это с событием beforeFilter следующим образом:

public function beforeFind($event, $query, $options, $primary)
{
    $query->selectAllExcept($this, ['shape']);
}

Это хорошо работает для пустых запросов, shape теперь исключено. Но теперь у меня нет контроля над другими полями, которые могут быть включены или нет:
$this->Cities->find()->select(['id', 'shape']) затем также выберет другие поля, потому что selectAllExcept().

1 Ответ

1 голос
/ 04 марта 2020

Вы можете просто переписать метод find('all') в своей таблице.

Например, в UsersTable:

public function findAll(Query $query, array $options)
{

    $query->selectAllExcept($this, ['password']);

    return $query;
}

, затем в вашем контроллере:

// select all except password
$users = $this->Users->find();
debug($users);

ИЛИ

// we try to select some fields, without success
$users = $this->Users->find()->select(['id', 'username', 'password']); 
debug($users);

ИЛИ

// we try to select some fields incl. password, with success
$users = $this->Users->find()->select(['id', 'username', 'password'], true); // <-- this overwrite select / selectAllExcept in custom finder
debug($users);
...