web-dev-qa-db-ja.com

Laravel Eloquent:結合されたテーブルから特定の列のみを取得する方法

Eloquentには、テーマとユーザーという2つの結合テーブルがあります。

テーマモデル:

public function user() {
  return $this->belongs_to('User');
}

ユーザーモデル:

public function themes() {
  return $this->has_many('Theme');
}

私のEloquent API呼び出しは次のようになります。

return Response::eloquent(Theme::with('user')->get());

これは、テーマからのすべての列を返します(それで問題ありません)。ユーザーモデルの 'username'列のみが必要ですが、クエリをそれに限定するにはどうすればよいですか?

91
ralu

モデルを変更して、選択する列を指定します。

public function user() {
  return $this->belongs_to('User')->select(array('id', 'username'));
}

また、参加する列を含めることを忘れないでください。

99
user2317976

Laravel> = 5.2の場合

-> pluck() メソッドを使用します

$roles = DB::table('roles')->pluck('title');

単一の列の値を含む配列を取得する場合は、pluckメソッドを使用できます


Laravel <= 5.1の場合

-> lists() メソッドを使用します

$roles = DB::table('roles')->lists('title');

このメソッドは、ロールのタイトルの配列を返します。返される配列のカスタムキー列を指定することもできます。

37
Javi Stolz

次のようにgetパラメーターでフィールドの配列を指定できます。

return Response::eloquent(Theme::with('user')->get(array('user.username'));

UPDATE(for Laravel 5.2) docs から、これを行うことができます:

$response = DB::table('themes')
    ->select('themes.*', 'users.username')
    ->join('users', 'users.id', '=', 'themes.user_id')
    ->get();
27
Melvin

私は知っている、あなたはEloquentを求めますが、あなたはそれを行うことができます Fluent Query Builder

$data = DB::table('themes')
    ->join('users', 'users.id', '=', 'themes.user_id')
    ->get(array('themes.*', 'users.username'));
21
aykut

これは私がそれをする方法です

$posts = Post::with(['category' => function($query){
        $query->select('id', 'name');
      }])->get();

User2317976による最初の回答は私にはうまくいきませんでした。laravel 5.1を使用しています

15
Sajjad Ashraf

別のオプションは、モデルの$hiddenプロパティを使用して、表示したくない列を非表示にすることです。このプロパティをオンザフライで定義するか、モデルにデフォルトを設定できます。

public static $hidden = array('password');

これで、JSON応答を返すときにユーザーパスワードが非表示になります。

同様の方法でオンザフライで設定することもできます。

User::$hidden = array('password');
11
Jason Lewis

ページネーションで使用する

$data = DB::table('themes')
->join('users', 'users.id', '=', 'themes.user_id')
->select('themes.*', 'users.username')
->paginate(6);
9
Nufayl

user2317976は、関連するテーブルの列を選択する優れた静的な方法を導入しました。

モデルを使用するときに必要なものを取得できるように、ここで私が見つけた動的なトリックを示します。

return Response::eloquent(Theme::with(array('user' => function ($q) {
    $q->addSelect(array('id','username'))
}))->get();

このトリックはload()でもうまく機能することがわかりました。これはとても便利です。

$queriedTheme->load(array('user'=>function($q){$q->addSelect(..)});

ターゲットテーブルのキーも含めるようにしてください。そうしないと、ターゲットテーブルを見つけることができません。

6
KinoP

こちらです:

Post::with(array('user'=>function($query){
    $query->select('id','username');
}))->get();
6
Specs

これは古い質問であることはわかっていますが、APIを作成している場合は、質問の作成者が行うように、出力トランスフォーマーを使用してこのようなタスクを実行します。

Transofrmerは、実際のデータベースクエリ結果とコントローラーの間のレイヤーです。これにより、ユーザーまたはAPIコンシューマーに出力されるものを簡単に制御および変更できます。

出力変換レイヤーの強固な基盤として、 フラクタル をお勧めします。ドキュメントを読むことができます こちら

5

Laravel 5.5では、これを行う最もクリーンな方法は次のとおりです。

Theme::with('user:userid,name,address')->get()

コロンを追加し、選択するフィールドをコンマで区切って、間にスペースを入れません。

4
JoeGalind

Laravel 4では、モデルに以下を追加することにより、特定のフィールドが返されないように隠すことができます。

protected $hidden = array('password','secret_field');

http://laravel.com/docs/eloquent#converting-to-arrays-or-json

4
John Veldboom

モデルの使用:

Model::where('column','value')->get(['column1','column2','column3',...]);

クエリビルダの使用:

DB::table('table_name')->where('column','value')->get(['column1','column2','column3',...]);
2
srmilon

これをよく理解していれば、1列だけを表示したい場合を除き、返される結果は問題ありません。もしそうなら、これは以下の方がはるかに簡単です:

return Response::eloquent(Theme::with('user')->get(['username']));
0
Kornel