2016-10-24 5 views
0

"get"メソッドと "find"メソッドを使用して2つの異なるポイントでデータベースからレコードを取得しています。問題は、私が "get"、 "first"または "last"を使用しているときに、隠しフィールドが表示されない(ok)が、私が "find"を使用しているときにはまだそこにあるということです。隠しフィールドはまだcakephpのデータベースからリストされています3

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

use Cake\ORM\Entity; 

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(); 

。 1つのレコード(最初、最後、呼び出し)を呼び出すのは正しいですが、メソッド "find"で試してみると間違っています。どのようにこれを解決するか知っていますか?

+0

では、隠しフィールドと仮想フィールドを混在させています。トピックには隠れフィールドがあります。その可能性のある解決策を投稿しましたが、問題が仮想フィールドにも関係しているかどうかはわかりません。 –

答えて

0

この問題の回答が見つかりました。 findは、すべての結果のエンティティを所有するオブジェクトを返します。そのため、テーブルのクラス内で「findAll」メソッドを使用して変換できます。

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

use Cake\ORM\Entity; 
use Cake\ORM\Query;//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(); 
     }); 
    }); 
    } 
} 
+0

問題を解決する唯一の行は "return $ row-> toArray();"です。隠しフィールドは配列とjson形式の結果のために除外されているので - http://book.cakephp.org/3.0/en/orm/entities.html#hiding-properties –

+0

Yap。これだよ。メソッドfindAllの内部でこれを行う方が簡単です。 –

0

私はこのようにそれを解決:

私の主な目的は、デフォルトで隠しフィールドを除外すると、私はそれらを必要とする場合、明示的に隠しフィールドを含むEntitysを取得する方法を持っていることでした。

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; 
} 

あなたは、単純な追加をすることができます隠しフィールド受信するには - >あなたのクエリに( 'パスワード')を選択し、それはもっと素敵にするために私は

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

カスタムファインダー

を追加しました

今、あなたは隠しフィールドを含むエンティティを受け取るために、このようなクエリを構築することができます:

ModelsController.php

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

または任意のクエリあなたがローク、単にカスタムファインダー 注を追加:動作しませんされて - > get($ id) - > findById($ id) - > find( '秘密') - > first()

あなたはこの解決策について何を考えているのか、あなたは変更されるでしょう - お気軽に:-)

関連する問題