web-dev-qa-db-ja.com

Laravelページネーションのモデルに$ hidden属性を表示する方法

私はLaravel 5.5を使用しています。これについて読み、この関数を知っていて、機能します makeVisible

$hidden = ['password', 'remember_token', 'email'];

を使用してメールを表示できます

$profile = auth()->user()->find($request->user()->id);
$profile->makeVisible(['email']);

フロントエンドにメールが表示されます。しかし、次のような多くの結果では機能しません

 // Get all users
 $users = User::with('role', 'level')->makeVisible(['email'])->paginate(10); // Doesn't work

また、この方法を試してください from Laracasts toJson 機能しますが、paginateを使用してそれを行うことはできません。他の方法またはこれを解決する方法を提供できますか?私の目的は、非表示になっているemail列を表示することです。ありがとう。

10
Goper Leo Zosa

私はこの方法を使用してこれを解決します。

モデルの_Users.php_

_public function toArray()
{
    // Only hide email if `guest` or not an `admin`
    if (auth()->check() && auth()->user()->isAdmin()) {
        $this->setAttributeVisibility();
    }

    return parent::toArray();
}

public function setAttributeVisibility()
{
    $this->makeVisible(array_merge($this->fillable, $this->appends, ['enter_relationship_or_other_needed_data']));
}
_

そしてコントローラ上で単純な

return User::with('role', 'level')->paginate(10);

ページネーションを作成する前に、ページネーションがtoArrayのどこから来るかを読みました。ご助力いただきありがとうございます。 また助けます

5
Goper Leo Zosa

あなたはこれを使うことができます:

    $paginator = User::with('role', 'level')->paginate($pageSize);
    $data = $pagination->getCollection();
    $data->each(function ($item) {
        $item->setHidden([])->setVisible(['email']);
    });
    $paginator->setCollection($data);
    return $paginator;
3
Star lin

このアプローチを試すことができます。 APIリソース を使用します。

APIリソースを使用すると、データを自由にフォーマットできます。複数のResourceオブジェクトを作成して、コレクションをさまざまな方法でフォーマットできます。

パラメータ(この場合はemail)を可視に設定し、その項目を返す必要がある場合は、その要素を返す別のResourceオブジェクトを使用できます。

したがって、メールが必要ない場合:

$users = User::with('role', 'level')->paginate(10);
return UserWithoutEmail::collection($users);

メールが必要な場合:

$users = User::with('role', 'level')->paginate(10);
return UserWithEmail::collection($users);
0
Kenny Horna