Скрытые поля по-прежнему отображаются в базе данных в cakephp 3

#php #cakephp-3.0

#php #cakephp-3.0

Вопрос:

Я получаю записи из своей базы данных в двух разных точках, используя методы «get» и «find». Проблема в том, что когда я использую «get», «first» или «last», скрытые поля не отображаются (это нормально), но когда я использую «find», они все еще там.

 <?php
//My Plugin in /plugins/Comunica/Files/src/Model/Entity/File.php
namespace ComunicaFilesModelEntity;

use CakeORMEntity;

class File extends Entity
{
  protected $_hidden = ['password'];
  protected $_virtual = ['protected'];

  protected function _getProtected(){
    return empty($this->_properties['protected']) ? false : true;
  }
}
  

Метод вызова:

 <?php
    $this->Files->find()->toArray();
  

Снова. Это правильно при вызове только одной записи (first, last, call), это просто неправильно при попытке с помощью метода «find». Кто-нибудь знает, как это решить?

Комментарии:

1. вы каким-то образом смешиваете скрытые и виртуальные поля.. в теме говорится о скрытых полях — я опубликовал возможное решение для этого, но я не уверен, что ваша проблема также связана с виртуальным полем.

Ответ №1:

Я нашел ответ на эту проблему. Функция find возвращает объект, которому принадлежат сущности каждого результата, так что вы можете преобразовать их, используя метод «findAll» внутри класса table.

 <?php
//My Plugin in /plugins/Comunica/Files/src/Model/Entity/File.php
namespace ComunicaFilesModelEntity;

use CakeORMEntity;
use CakeORMQuery;//Include this class to manipulate the results

class File extends Entity
{
  protected $_hidden = ['password'];
  protected $_virtual = ['protected'];

  protected function _getProtected(){
    return empty($this->_properties['protected']) ? false : true;
  }

 //New formatation code
  public function findAll(Query $query, array $options)
  {
    return $query->formatResults(function ($results) {
      return $results->map(function($row) {
          $row['upload_date'] = $this->dateTimeConvert($row['upload_date']);
          return $row->toArray();
      });
    });
  }
}
  

Комментарии:

1. Единственная строка, которая решает вашу проблему, это «return $row->toArray();» поскольку скрытые поля исключены для результатов в формате array и json — book.cakephp.org/3.0/en/orm/entities.html#hiding-properties

2. Yap. Это все. Это проще сделать внутри метода findAll.

Ответ №2:

Я решил это следующим образом:

Моей главной целью было исключить скрытые поля по умолчанию и иметь способ явно получать объекты, включающие скрытые поля, если они мне понадобятся.

ModelsTable.php

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

    //ATTENTION: if password field is excluded we have to bypass for Auth-Component to work
    if(array_key_exists('password',$_REQUEST)){
        return $event;
    }

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

    $tableSchema = $this->schema();

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

    return $event;
}
  

Model.php

 protected $_hidden = [
    'password',
    'otherSecret'
];

protected function _getHidden(){
    return $this->_hidden;
}
  

Чтобы получить скрытые поля, вы можете просто добавить -> выбрать (‘пароль’) к вашему запросу, но чтобы сделать его более приятным, я добавил пользовательский поисковик

ModelsTable.php

 public function findSecrets(Query $query, array $options)
{
    $tableSchema = $this->schema();
    $fields = $tableSchema->columns();
    return $query->select($fields);
}
  

Теперь вы можете создать подобный запрос, чтобы получить объект, включающий скрытые поля:

ModelsController.php

 $secretModels = $this->Models->find()->find('secrets');
  

или какой бы запрос вы ни выбрали, просто добавьте пользовательский поисковик
ПРИМЕЧАНИЕ: is не работает с -> get ($ id), поэтому вам нужно использовать -> findById($id)-> find(‘secrets’)->first()

Я рад узнать, что вы думаете об этом решении или что бы вы изменили — не стесняйтесь рекомендовать 🙂