0

認証されたユーザーが自分のデータを見ているのか、別のユーザーからのデータを見ているのかによって、異なるデータを表示する次のコードがあります。コードは機能しますが、私の意見では非常に厄介です。

public function showUserDetailed(Request $request, $username)
    {
    $key = strtolower($username).'-data-detailed';

    if(Auth::user()->usenrame === $username) {
        $key = $key .'-own';
    }

    if(Cache::has($key)) {
        if($request->wantsJson()) {
            return request()->json(Cache::get($key));
        } else {
            return view('user/detailed', ['user' => Cache::get($key)]);
        }
    } else {
        if(Auth::user()->username === $username) {
            $u = User::where('username', $username)->first();

            $user = new \stdClass();
            $user->username = $u->username;
            $user->email = $u->email;
            $user->address = $u->address;
            $user->city = $u->city;
            $user->state = $u->state;
            $user->zip = $u->zip;
            $user->phone = $u->phone;
            $user->follows = $u->follows;
            $user->ratings = $u->ratings;
            $user->location = $u->location;
        } else {
            $u = User::where('username', $username)->first(['username', 'city', 'state']);

            $user = new \stdClass();
            $user->username = $u->username;
            $user->city = $u->city;
            $user->state = $u->state;
            $user->follows = $u->follows;
            $user->ratings = $u->ratings;
        }

        Cache::put($key, $user);

        if($request->wantsJson()) {
            return response()->json($user);
        } else {
            return view('user/detailed', ['user' => $user]);
        }
    }
}

モデル呼び出しで次のようなものを使用しようとしました。

User::where('username', $username)->with('follows', 'ratings', 'location')->find(['username', 'city', 'state');

ただし、ユーザー テーブルから取得する列を指定すると、関係データが無効になるため、空の配列として返されます。これをよりクリーンにする別の方法はありますか?この状況で stdClass を作成してデータ コンテナーにする必要があることを軽蔑し、何かが足りないと感じています。

// this works
User::where('username', $username)->with('follows', 'ratings', 'location')->first();

// this also works
User::where('username', $username)->first(['username', 'city', 'state']);

// this does not
User::where('username', $username)->with('follows', 'ratings', 'location')->first(['username', 'city', 'state']);
4

1 に答える 1

1

列を指定し、関連するモデルも取得したい場合idは、選択した列に (または使用している外部キーを) 含める必要があります。

リレーションシップは、次のような別のクエリを実行します。

SELECT 'stuff' FROM 'table' WHERE 'foreign_key' = ($parentsId)

そのため、親 (元のモデル) の ID を知る必要があります。同じロジックが、少し異なる形ですべての関係に適用されます。

于 2017-01-06T21:40:08.233 に答える