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'列のみが必要ですが、クエリをそれに限定するにはどうすればよいですか?
モデルを変更して、選択する列を指定します。
public function user() {
return $this->belongs_to('User')->select(array('id', 'username'));
}
また、参加する列を含めることを忘れないでください。
-> pluck() メソッドを使用します
$roles = DB::table('roles')->pluck('title');
単一の列の値を含む配列を取得する場合は、pluckメソッドを使用できます
-> lists() メソッドを使用します
$roles = DB::table('roles')->lists('title');
このメソッドは、ロールのタイトルの配列を返します。返される配列のカスタムキー列を指定することもできます。
次のように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();
私は知っている、あなたはEloquentを求めますが、あなたはそれを行うことができます Fluent Query Builder
$data = DB::table('themes')
->join('users', 'users.id', '=', 'themes.user_id')
->get(array('themes.*', 'users.username'));
これは私がそれをする方法です
$posts = Post::with(['category' => function($query){
$query->select('id', 'name');
}])->get();
User2317976による最初の回答は私にはうまくいきませんでした。laravel 5.1を使用しています
別のオプションは、モデルの$hidden
プロパティを使用して、表示したくない列を非表示にすることです。このプロパティをオンザフライで定義するか、モデルにデフォルトを設定できます。
public static $hidden = array('password');
これで、JSON応答を返すときにユーザーパスワードが非表示になります。
同様の方法でオンザフライで設定することもできます。
User::$hidden = array('password');
ページネーションで使用する
$data = DB::table('themes')
->join('users', 'users.id', '=', 'themes.user_id')
->select('themes.*', 'users.username')
->paginate(6);
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(..)});
ターゲットテーブルのキーも含めるようにしてください。そうしないと、ターゲットテーブルを見つけることができません。
こちらです:
Post::with(array('user'=>function($query){
$query->select('id','username');
}))->get();
Laravel 5.5では、これを行う最もクリーンな方法は次のとおりです。
Theme::with('user:userid,name,address')->get()
コロンを追加し、選択するフィールドをコンマで区切って、間にスペースを入れません。
Laravel 4では、モデルに以下を追加することにより、特定のフィールドが返されないように隠すことができます。
protected $hidden = array('password','secret_field');
http://laravel.com/docs/eloquent#converting-to-arrays-or-json
モデルの使用:
Model::where('column','value')->get(['column1','column2','column3',...]);
クエリビルダの使用:
DB::table('table_name')->where('column','value')->get(['column1','column2','column3',...]);
これをよく理解していれば、1列だけを表示したい場合を除き、返される結果は問題ありません。もしそうなら、これは以下の方がはるかに簡単です:
return Response::eloquent(Theme::with('user')->get(['username']));