web-dev-qa-db-ja.com

Laravel:返された結果の属性を削除する

私は次のコードを持っています:

$orders = Order::all();
return $orders;

これは次のようなものを返します:

[
     {
         "id": 123,
         "qr_code": "foo.png",
         "qr_code_url": "http://example.com/foo.png"
     },
     {
         "id": 112,
         "qr_code": "bar.png",
         "qr_code_url": "http://example.com/var.png"
     }
]

ご了承ください qr_code_urlは追加された属性であり、データベースに格納されている属性ではありません。

このコレクションを属性なしでユーザーに返したい:qr_code、 この場合。このように:

[
     {
         "id": 123,
         "qr_code_url": "http://example.com/foo.png"
     },
     {
         "id": 112,
         "qr_code_url": "http://example.com/var.png"
     }
]

コレクション関数を見て、これを行う簡単な方法を見つけることができないようです: https://laravel.com/docs/5.4/collections

私が欲しいものに近いのはexceptforgetだけですが、これらは1次元配列でのみ機能するようです。モデルによって返される収集結果ではありません。

どうすれば問題を解決できますか?

6
Yahya Uddin

属性をモデルクラスで非表示に設定できます( Jsonからの属性の非表示 を参照)

_/**
 * The attributes that should be hidden for serialization.
 *
 * @var array
 */
protected $hidden = ['qr_code'];
_

属性は引き続き読み込まれますが、コレクションには表示されません。

永続化したくない場合は、ドキュメントで説明されているようにmakeHidden() eloquentメソッドを使用できます。

属性の可視性を一時的に変更する

特定のモデルインスタンスで一般的に非表示になっている属性を表示したい場合は、makeVisibleメソッドを使用できます。 makeVisibleメソッドは、便利なメソッドチェーンのモデルインスタンスを返します。

_return $user->makeVisible('attribute')->toArray(); 
_

同様に、特定のモデルインスタンスで通常表示される属性を非表示にする場合は、makeHiddenメソッドを使用できます。

_return $user->makeHidden('attribute')->toArray();
_
16
Elias Soares
$eloquentCollection->transform(function (Model $result) use ($forgetThisKey) {
    $attributes = $result->getAttributes();
    unset($attributes[$forgetThisKey]);
    $result->setRawAttributes($attributes, true);
    return $result;
});
5
kmuenkel

APIをビルドするとき、出力データを制御するための推奨される方法は fractal トランスフォーマーを使用することです。

それが多すぎて単純にしたい場合は、コレクションでlaravel pluckメソッドを使用できます。

2
Mirceac21