4

私の問題は、usersテーブルからuserのデータをフェッチするとき、usersテーブルからフェッチされたuserテーブルのすべてのフィールドです。しかし、パスワードと電子メールアドレスを含めたくないので、以外のフィールドのみをフェッチする方法はありますか?パスワードとメールアドレス?

よろしく。

4

4 に答える 4

8

juhanaが述べたように、find呼び出しによって返されるすべてのフィールドを使用する必要はありません。あなたが解決しようとしている実際の問題が何であるかは明確ではなく、将来の質問でそのような詳細を明確にすることはあなたの利益になるでしょう。

直接クエリの場合

ユーザーモデルで直接クエリを実行するには、次のようなロジックを使用できます。

public function beforeFind($queryData) {
    if (empty($queryData['fields'])) {
        $schema = $this->schema();
        unset($schema['password']);
        unset($schema['email']);

        foreach (array_keys($schema) as $field) {
            $queryData['fields'][] = $this->alias . '.' . $field;
        }
        return $queryData;
    }

    return parent::beforeFind($queryData);

}

でも

これは、別のモデルにクエリを実行するクエリには何もしません。

$results = $PostModel->find('all', array(
    'contain' => array('User')
));

上記の場合、すべてのユーザーフィールドが返されます。このような用途では、自動魔法に頼るのではなく、フィールドリストを明示的に定義するのがおそらく最善です。

$results = $PostModel->find('all', array(
    'contain' => array('User')
    'fields' => array('Post.*', 'User.name')
));
于 2013-01-09T08:55:51.413 に答える
2

あなたはこのようなことをしなければなりません

$this->Model->find('all',array('fields'=>array('id','name')));     

fields配列のrequireフィールドに言及するだけです。

モデルからフェッチしたい場合は、これを試してください

$this->find('all',array('fields'=>array('id','name')));     

ありがとう。

于 2013-01-09T06:31:31.957 に答える
0
$this->User->find('all',array('fields'=>array('User.id','User.name','User.created', etc etc)));

フィールド宣言でModel.fieldを使用していることに気付くかもしれません。これは、関連するモデルに競合するフィールド名がある場合に備えてです。

ここにあるCakePHPのマニュアルから引用したもので、モデルでFindメソッドを使用すると、以下のすべてのオプションを使用できます。

array(
    'conditions' => array('Model.field' => $thisValue), //array of conditions
    'recursive' => 1, //int
    'fields' => array('Model.field1', 'DISTINCT Model.field2'), //array of field names
    'order' => array('Model.created', 'Model.field3 DESC'), //string or array defining order
    'group' => array('Model.field'), //fields to GROUP BY
    'limit' => n, //int
    'page' => n, //int
    'offset' => n, //int
    'callbacks' => true //other possible values are false, 'before', 'after'
)
于 2013-01-09T06:35:09.883 に答える
0

Userこれをモデルに追加します。

public function beforeFind($queryData) {
    if (isset($this->includeAllFields)) {
        return $queryData;
    }

    if (empty($queryData['fields'])) {
        $queryData['fields'] = array(
            // Specify all fields EXCEPT for "password" and "email".

            'User.field1',
            'User.field2',
            'User.field3'
        );
    }

    return $queryData;
}

$this->includeAllFieldsCakePHPの一部ではありません。それは私が作ったカスタムプロパティです。何らかの理由でパスワードと電子メールアドレスを含める必要がある場合は$this->User->includeAllFields = true;、検索の前に追加してください。

私が考えることができるこのアプローチの唯一の欠点は、フィールドがデータベースに追加またはデータベースから削除された場合、上記のコードのフィールドの配列を更新する必要があることです。

于 2013-01-09T07:27:16.773 に答える