CakePHP: Могу ли я игнорировать поле при чтении модели из БД? - PullRequest
4 голосов
/ 04 июня 2010

В одной из моих моделей у меня есть поле "LONGTEXT", в котором есть большой дамп кучки вещей, которые мне никогда не хочется читать, и это замедляет работу, поскольку я перемещаю намного больше данных между БД и веб-приложение.

Есть ли способ указать в модели, что я хочу, чтобы CakePHP просто игнорировал это поле и никогда не читал его и ничего с ним не делал?

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

Спасибо!
Daniel

Ответы [ 4 ]

8 голосов
/ 04 июня 2010

Как сказал @SpawnCxy, вам нужно будет использовать опцию 'fields' => array(...) в find, чтобы ограничить данные, которые вы хотите получить. Если вы не хотите делать это каждый раз, когда пишете find, вы можете добавить что-то подобное в обратный вызов вашей модели beforeFind(), который автоматически заполнит опции fields всеми полями, кроме поля длинного текста:

function beforeFind($query) {
    if (!isset($query['fields'])) {
        foreach ($this->_schema as $field => $foo) {
            if ($field == 'longtextfield') {
                continue;
            }
            $query['fields'][] = $this->alias . '.' . $field;
        }
    }
    return $query;
}

По поводу комментария:

Это правда ... Самый простой способ в этом случае, вероятно, состоит в том, чтобы удалить поле из схемы.

unset($this->Model->_schema['longtextfield']);

Я не проверял его, но это должно помешать включению поля в запрос. Если вы хотите сделать это переключаемым для каждого запроса, вы можете переместить его в другую переменную, например $Model->_schemaInactiveFields, и переместить ее обратно, когда это необходимо. Вы могли бы даже сделать Поведение для этого.

4 голосов
/ 04 июня 2010

Параметр fields может помочь вам. Он не игнорирует поля, а указывает нужные вам поля:

array(
'conditions' => array('Model.field' => $thisValue), //array of conditions
'fields' => array('Model.field1', 'Model.field2'), //list columns you want
)

Более подробную информацию о получении данных вы можете получить из поваренной книги .

Другая идея :

Определите ваш специальный запрос в модели:

function myfind($type,$params)
{
     $params['fields'] = array('Model.field1','Model.field2',...);
     return $this->find($type,$params);
}

Тогда используйте его в контроллере

$this->Model->myfind($type,$params);
1 голос
/ 04 июня 2010

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

class Post extends AppModel { <br> var $actsAs = array('Containable'); <br> }

где Post - ваша модель

0 голосов
/ 25 ноября 2016

Вы можете добавить функцию beforeFilter в вашу таблицу и добавить выборку к запросу

Excample:

public function beforeFind(Event $event, Query $query){

$protected = $this->newEntity()->hidden;

$tableSchema = $event->subject()->schema();

$fields = $tableSchema->columns();
foreach($fields as $key => $name){
    if(in_array($name,$protected)){
        unset($fields[$key]);
    }
}
$query->select($fields);

return $event;

}

В этом примере я взял скрытые поля из ModelClass, чтобы исключить их из результата.

Взял его из моего ответа на симуляционный вопрос здесь: Скрытые поля все еще перечислены из базы данных в cakephp 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...