[英]Laravel Eloquent: How to get only certain columns from joined tables
我在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());
它返回主題中的所有列(沒關系),以及來自用戶的所有列(不是很好)。 我只需要用戶模型中的“用戶名”列,如何限制查詢?
更改模型以指定要選擇的列:
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'));
更新(對於Laravel 5.2)從文檔中 ,您可以這樣做:
$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();
用戶2317976的第一個回答對我不起作用,我正在使用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 4中,您可以通過在模型中添加以下內容來隱藏某些字段。
protected $hidden = array('password','secret_field');
http://laravel.com/docs/eloquent#converting-to-arrays-or-json
在Laravel 5.5上,最簡潔的方法是:
Theme::with('user:userid,name,address')->get()
添加冒號和要選擇的字段用逗號分隔,並且它們之間沒有空格。
使用模型:
Model::where('column','value')->get(['column1','column2','column3',...]);
使用查詢生成器:
DB::table('table_name')->where('column','value')->get(['column1','column2','column3',...]);
如果我很好理解這個,那么返回的很好,除非你只想看到一列。 如果是這樣,下面的內容應該簡單得多:
return Response::eloquent(Theme::with('user')->get(['username']));
查看, http://laravel.com/docs/database/eloquent#to-array
您應該能夠定義不希望在api中顯示哪些列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.