#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()
Я рад узнать, что вы думаете об этом решении или что бы вы изменили — не стесняйтесь рекомендовать 🙂