programing

Larabel Alturnal의 "With()" 함수를 사용하여 특정 열 가져오기

firstcheck 2022. 9. 19. 21:36
반응형

Larabel Alturnal의 "With()" 함수를 사용하여 특정 열 가져오기

테이블이 두 개 있는데User그리고.Post.하나.User많은 것을 가질 수 있다posts그리고 하나post한 사람만의 것이다user.

인마이User내가 가지고 있는 모델hasMany관계...

public function post(){
    return $this->hasmany('post');
}

그리고 내 안에post내가 가지고 있는 모델belongsTo관계...

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

이제 이 두 테이블을 결합합니다.Eloquent with()두 번째 표의 특정 열을 원합니다.Query Builder를 사용할 수 있지만 사용할 수 없습니다.

에 있을 때Post내가 쓰는 모델...

public function getAllPosts() {
    return Post::with('user')->get();
}

다음 쿼리를 실행합니다...

select * from `posts`
select * from `users` where `users`.`id` in (<1>, <2>)

하지만 내가 원하는 건...

select * from `posts`
select id,username from `users` where `users`.`id` in (<1>, <2>)

사용할 때...

Post::with('user')->get(array('columns'....));

첫 번째 테이블의 열만 반환합니다.다음을 사용하여 특정 열 지정with()두 번째 테이블에서요.내가 어떻게 그럴 수 있을까?

글쎄, 난 해결책을 찾았어.통과하면 할 수 있다.closure에서 기능하다.with()같은 배열의 두 번째 지표로서

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

선택만 됩니다.id그리고.username다른 테이블에서.이것이 다른 사람들에게 도움이 되기를 바랍니다.


프라이머리(이 경우는 ID)는, 의 첫 번째 파라메타로 할 필요가 있습니다.$query->select()필요한 결과를 얻을 수 있습니다.*

Larabel 5.5부터 다음과 같이 할 수 있습니다.

Post::with('user:id,username')->get();

케어:id필드 및foreign keys문서에 기재된 바와 같이:

이 기능을 사용할 때는 항상 id 열과 관련된 외부 키 열을 가져올 열 목록에 포함해야 합니다.

예를 들어 사용자가 팀에 소속되어 있으며,team_id그러면 외부 키 열로 지정됩니다.$post->user->team지정하지 않으면 비어 있습니다.team_id

Post::with('user:id,username,team_id')->get();

또한 사용자가 게시물에 속해 있는 경우(즉, 열이 있음)post_id에서userstable)에서 다음과 같이 지정해야 합니다.

Post::with('user:id,username,post_id')->get();

그렇지않으면$post->user비게 됩니다.

특정 열을 사용하여 모형을 로드하는 경우 급하게 로드하지는 않지만 다음을 수행할 수 있습니다.

고객님의 고객명Post모델

public function user()
{
    return $this->belongsTo('User')->select(['id', 'username']);
}

원래 크레딧은 Larabel Expiry Loading - 특정 열만 로드

반대 방향(많은 경우):

User::with(array('post'=>function($query){
    $query->select('id','user_id');
}))->get();

관계를 해결하기 위해 외부 키(이 예에서는 user_id라고 가정)를 포함하는 것을 잊지 마십시오.그렇지 않으면 관계에 대한 결과가 0이 됩니다.

Larabel 5.7에서는 다음과 같이 특정 필드를 호출할 수 있습니다.

$users = App\Book::with('author:id,name')->get();

추가하는 것이 중요합니다.foreign_key필드를 선택합니다.

다음을 사용하여 특정 열을 가져오려면with()라라벨 웅변에서는 다음과 같은 코드를 사용할 수 있습니다.이 코드는 원래 @Adam이 이 질문에 대한 답변으로 답변한 것입니다.답변의 주요 코드는 다음과 같습니다.

Post::with('user:id,username')->get();

그래서 나는 그것을 내 코드에 사용했지만 그것은 나에게 에러를 주고 있었다. 그래서 너희들도 같은 문제에 직면해 있다면

그런 다음 이 문제를 해결하려면 다음 코드와 같이 메서드의 id앞에 테이블 이름을 지정해야 합니다.

Post::with('user:user.id,username')->get();

나는 이 문제를 발견했지만 두 번째 관련 오브젝트 층을 발견했다.@Awais Qarni의 답변은 네스트된 선택문에 적절한 외부 키를 포함시키는 것으로 유효합니다.첫 번째 중첩된 선택 문에서 관련 모델을 참조하기 위해 ID가 필요한 것처럼 두 번째 수준의 관련 모델(이 예에서는 회사 모델)을 참조하기 위해 외부 키가 필요합니다.

Post::with(['user' => function ($query) {
        $query->select('id','company_id', 'username');
    }, 'user.company' => function ($query) {
        $query->select('id', 'name');
    }])->get();

또한 Post 모델에서 특정 열을 선택할 경우 참조하기 위해 select 문에 user_id 열을 포함해야 합니다.

Post::with(['user' => function ($query) {
        $query->select('id', 'username');
    }])
    ->select('title', 'content', 'user_id')
    ->get();

고객님의 고객명Post 표시:

public function userWithName()
{
    return $this->belongsTo('User')->select(array('id', 'first_name', 'last_name'));
}

, 그럼 에는 '어울릴 수 .$post->userWithName

특정 열을 빠르게 로드할 수 있는 다른 방법이 있습니다.

public function show(Post $post)
{
    $posts = $post->has('user')->with('user:id,name,email,picture')->findOrFail($post->id);
    return view('your_blade_file_path',compact('posts);
}

고객님의 고객명Post 있어야 할 user

public function user()
{
    return $this->belongsTo( User::class, 'user_id')->withDefault();
}

주의: Laravel 문서에 기재되어 있습니다.

https://laravel.com/docs/8.x/eloquent-relationships#eager-loading-specific-columns

estado_id를 반환하지 않고 같은 답변을 받고 싶습니다.

$this->cidade
->with('estado:id,nome')
->select(['id', 'nome', 'estado_id']);

선택 항목에 estado_id를 입력하지 않은 경우

{
      "id": 1100015,
      "nome": "Alta Floresta D'Oeste",
      "estado": null
}

선택 항목에 estado_id를 입력하면

{
      "id": 1100015,
      "nome": "Alta Floresta D'Oeste",
      "estado_id": 11,
      "estado": {
        "id": 11,
        "nome": "Rondônia"
      }
}

기대됩니다

{
      "id": 1100015,
      "nome": "Alta Floresta D'Oeste",
      "estado": {
        "id": 11,
        "nome": "Rondônia"
      }
}

표의 열이 하나만 필요한 경우 '목록'을 사용하는 것이 좋습니다.내 경우 사용자가 즐겨찾는 기사를 가져오고 있지만 문서 ID만 원합니다.

$favourites = $user->favourites->lists('id');

다음과 같은 ID 배열을 반환합니다.

Array
(
    [0] => 3
    [1] => 7
    [2] => 8
)

PHP 7.4 이후를 사용하는 경우 화살표 기능을 사용하여 보다 깔끔하게 표시할 수도 있습니다.

Post::with(['user' => fn ($query) => $query->select('id','username')])->get();

사용자 모델(Laravel 8.x.x)과 belongs To Many 관계를 사용하다가 동일한 문제에 직면했습니다.

오랜 검색과 시행 및 테스트 방법.나는 이 답을 알아냈다.

ID 및 관계에 필요한 외부 키를 해당 관계 중 하나에서 선택해야 합니다.이를 통해 웅변가는 부모를 자녀와 연결시킬 수 있습니다.

원본 크레딧은 https://stackoverflow.com/a/64233242/1551102로 보내드립니다.

그래서 나는 포함시켰다.

Groups::select('groupid')
...

그리고 그것은 마법처럼 작동했다.지금은 가져오기 후 groupid 필드를 숨기는 방법을 알고 싶습니다.어레이를 루프하여 제거할 수 있습니다.하지만 다른 방법이 있을까요?어쩌면 더 단순하고 더 나은 방법일 수도 있죠

모델에 액세스할 때 관련 모델에 열을 지정할 수도 있습니다.

Post::first()->user()->get(['columns....']);

이 코드를 사용해 보세요.라라벨 6 버전으로 테스트되고 있습니다.

Controller code
 public function getSection(Request $request)
{

  Section::with(['sectionType' => function($q) {
      $q->select('id', 'name');
  }])->where('position',1)->orderBy('serial_no', 'asc')->get(['id','name','','description']);
  return response()->json($getSection);
}
Model code
public function sectionType(){
    return $this->belongsTo(Section_Type::class, 'type_id');
}

, 그럼 에는 '어울리지 않다'를 사용하시면 .pluckCollection: " " 。

" " "만 반환됩니다.uuid「」의 Post model

App\Models\User::find(2)->posts->pluck('uuid')
=> Illuminate\Support\Collection {#983
     all: [
       "1",
       "2",
       "3",
     ],
   }

조건부로 해 보세요.

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

다른 솔루션과 마찬가지로 다음과 같습니다.

// For example you have this relation defined with "user()" method
public function user()
{
    return $this->belongsTo('User');
}
// Just make another one defined with "user_frontend()" method
public function user_frontend()
{
    return $this->belongsTo('User')->select(array('id', 'username'));
}

// Then use it later like this
$thing = new Thing();
$thing->with('user_frontend');

// This way, you get only id and username, 
// and if you want all fields you can do this

$thing = new Thing();
$thing->with('user');

때, 이 말을는, 해 주세요.key열은 아무것도 반환하지 않습니다.「 」만는,username★★★★★★★★★★★★★★★★★ id, 「」, 「」를 할 수 .$visible/$hidden다음과 같이 합니다.

앱/모델/User.php

protected $visible = ['username'];

그런 다음 검색만 합니다.username§:

Post::with('user')->get();

key§:

'숨기다', '', '숨기다', '숨기다', '숨기다',key원하는 열만 가져옵니다.

앱/모델/User.php

protected $hidden = ['id'];

하다를 포함하여 합니다.key 않으면 , 「유저명」은 반환되지 않기 때문입니다.id$hidden.

Post::with('user:id,username')->get();
EmployeeGatePassStatus::with('user:id,name')->get();

언급URL : https://stackoverflow.com/questions/19852927/get-specific-columns-using-with-function-in-laravel-eloquent

반응형