簡體   English   中英

Laravel Eloquent:如何僅從連接表中獲取某些列

[英]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'));
}

並且不要忘記包括您要加入的列。

對於Laravel> = 5.2

使用- > pluck()方法

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

如果要檢索包含單個列的值的數組,可以使用pluck方法


對於Laravel <= 5.1

使用- > 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();

我知道這是一個老問題,但如果你正在構建一個API,正如問題的作者那樣,使用輸出變換器來執行這些任務。

Transofrmer是實際數據庫查詢結果和控制器之間的一個層。 它允許輕松控制和修改將輸出給用戶或API使用者的內容。

我建議Fractal作為輸出轉換層的堅實基礎。 您可以在此處閱讀文檔。

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM